【问题标题】:How to specify ignore case in when statement in Sybase如何在 Sybase 中的 when 语句中指定忽略大小写
【发布时间】:2011-05-21 22:42:59
【问题描述】:

如何在Sybasewhere 语句中指定忽略大小写

基本上我想要

 select * from _table where _field = 'BUSY'

如果在字段 _field 中存在任何具有“BuSy”等值的行,则返回行。

【问题讨论】:

  • 您能否定义列以使用不区分大小写的排序规则?
  • 不,我有权仅在“只读”模式下使用目标数据库。这是你要求的吗?
  • 是的。如果您无法更改架构,那么您可能会遇到类似 LadaRaider 的答案。我想你可以试试where (_field LIKE 'B%' OR _field LIKE 'b%') AND UPPER(_field) = 'BUSY' 看看会不会更好。
  • 对执行计划毫无帮助..
  • 您使用的是 Sybase ASE (Adaptive Server Enterprise) 还是 Sybase SQL Anywhere?它们是完全不同的数据库产品。

标签: sql sybase


【解决方案1】:
select * from _table where UPPER(_field) = 'BUSY'

【讨论】:

  • 此查询的执行计划比没有 UPPER 的查询大 18 倍。不知道还有没有其他功能,或者,执行计划可以改进一下。
  • 这是因为我在_field上有索引,使用UPPER时会被忽略
  • 我会使用以下select * from _table where UPPER(_field) = UPPER('busy')。使两个操作数都为 UPPER。在参数化查询中或当您有 String.Format("select * from _table where UPPER(_field) = UPPER('{}')", query) 时;这会起作用的。
【解决方案2】:

AFAIK,在索引列上应用函数将不允许优化器使用该索引。 最简单的方法是将语句重写为:

select * from _table where _field like '[bB][uU][sS][yY]'

这应该允许优化器使用索引。

【讨论】:

  • 对不起,对我不起作用。使用表扫描:“表扫描。语句 1(第 1 行)的总估计 I/O 成本:1550556。”
【解决方案3】:

您唯一的选择是 Transact SQL 函数。 This page lists them all

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    相关资源
    最近更新 更多