【发布时间】:2010-11-05 03:13:32
【问题描述】:
正如我在标题中所写,我有 SQL 查询,在 Oracle DB 上运行,可以说:
SELECT * FROM TABLE WHERE TABLE.NAME Like 'IgNoReCaSe'
如果我愿意,查询将返回“IGNORECASE”、“ignorecase”或它们的组合,该怎么做?
【问题讨论】:
正如我在标题中所写,我有 SQL 查询,在 Oracle DB 上运行,可以说:
SELECT * FROM TABLE WHERE TABLE.NAME Like 'IgNoReCaSe'
如果我愿意,查询将返回“IGNORECASE”、“ignorecase”或它们的组合,该怎么做?
【问题讨论】:
在 12.2 及更高版本中,使查询不区分大小写的最简单方法是:
SELECT * FROM TABLE WHERE TABLE.NAME COLLATE BINARY_CI Like 'IgNoReCaSe'
【讨论】:
使用 ALTER SESSION 语句将比较设置为不区分大小写:
alter session set NLS_COMP=LINGUISTIC;
alter session set NLS_SORT=BINARY_CI;
如果您仍在使用 10gR2 版本,请使用以下语句。见this FAQ for details。
alter session set NLS_COMP=ANSI;
alter session set NLS_SORT=BINARY_CI;
【讨论】:
您可以使用upper 或lower 函数将这两个值转换为大写或小写:
Select * from table where upper(table.name) like upper('IgNoreCaSe')
或
Select * from table where lower(table.name) like lower('IgNoreCaSe');
【讨论】:
or?是否可以大写匹配小写不匹配?
or 来演示这两个选项。我不认为一个匹配而另一个匹配是不可能的。
你也可以使用正则表达式:
SELECT * FROM TABLE WHERE REGEXP_LIKE (TABLE.NAME,'IgNoReCaSe','i');
【讨论】:
您可以在查询中使用 upper() 函数,为了提高性能,您可以使用基于函数的索引
CREATE INDEX upper_index_name ON table(upper(name))
【讨论】:
也不要忘记显而易见的,表中的数据需要有大小写吗?您只能插入已经小写的行(或将现有的数据库行转换为小写)并从一开始就完成。
【讨论】:
...也在查询之外进行转换为上限或下限:
tableName:= UPPER(someValue || '%');
...
Select * from table where upper(table.name) like tableName
【讨论】:
Select * from table where upper(table.name) like upper('IgNoreCaSe');
或者,用lower代替upper。
【讨论】:
LIKE。这可能会导致不必要的副作用,例如当字符串包含像% 这样的特殊字符时。使用upper(table.name) = upper('iGnOrEcASe') 应该更安全。
你可以在 where 条件的两边使用 lower 或 upper 函数
【讨论】: