Oracle DB:如何编写查询忽略大小写?

zer*_*ble 52 sql database oracle

正如我在标题中所写,我有SQL查询,在Oracle DB上运行,让我们说:

SELECT * FROM TABLE WHERE TABLE.NAME Like 'IgNoReCaSe'
Run Code Online (Sandbox Code Playgroud)

如果我想,查询将返回"IGNORECASE","ignorecase"或它们的组合,如何做到这一点?

这可能吗?

Hoo*_*voo 117

Select * from table where upper(table.name) like upper('IgNoreCaSe');
Run Code Online (Sandbox Code Playgroud)

或者,将下部替换为上部.


dev*_*vio 36

您可以使用ALTER SESSION语句将比较设置为不区分大小写.见这个FAQ.

alter session set NLS_COMP=ANSI;
alter session set NLS_SORT=BINARY_CI;
Run Code Online (Sandbox Code Playgroud)

对于所有在此原始答案被接受后8年访问的人(10gR2):

在10gR2之后,NLS_COMP设置必须是"LINGUISTIC":

ALTER SESSION SET NLS_COMP=LINGUISTIC;
Run Code Online (Sandbox Code Playgroud)

  • 我不确定你在谈论什么开销.如果创建"普通"索引,然后更改NLS_COMP和NLS_SORT,Oracle将无法再使用索引来查找有问题的数据.因此,您最终会为适合的任何列创建特定于NLS设置的索引.对我来说,如何产生比基于函数的索引(FBI)更多或更少的开销并不明显.显然,如果您希望所有查询都不区分大小写,则无需在列上维护索引,在UPPER(列)上维护FBI(或维护不同NLS设置的索引) (3认同)

joe*_*joe 28

您可以在where条件的两侧使用lower或upper函数

  • 如果你在谈论Oracle执行操作所花费的时间,那么像upper这样的函数的使用永远不会受到影响 - 与加载数据页所花费的时间相比,cpu进行转换所花费的时间是微不足道的.从缓存中,不要介意从磁盘中获取它.但是,使用lower或upper将阻止查询使用这些列上的任何索引,除非您创建了使用这些函数的索引.但LIKE也可能阻止索引使用,特别是如果表达式中的第一个字符是通配符. (6认同)

小智 13

您还可以使用正则表达式:

SELECT * FROM TABLE WHERE REGEXP_LIKE (TABLE.NAME,'IgNoReCaSe','i');
Run Code Online (Sandbox Code Playgroud)


akf*_*akf 7

您可以在查询中使用upper()函数,为了提高性能,您可以使用基于函数的索引

 CREATE INDEX upper_index_name ON table(upper(name))
Run Code Online (Sandbox Code Playgroud)


小智 5

您可以使用upperlower函数将两个值转换为大写或小写:

Select * from table where upper(table.name) like upper('IgNoreCaSe')
Run Code Online (Sandbox Code Playgroud)

或者

Select * from table where lower(table.name) like lower('IgNoreCaSe');
Run Code Online (Sandbox Code Playgroud)

  • 我认为@user3666177 发布了 `or` 来演示这两个选项。我认为一个匹配而不是另一个匹配是不可能的。 (3认同)

小智 5

在12.2及以上版本中,使查询不区分大小写的最简单方法是:

SELECT * FROM TABLE WHERE TABLE.NAME COLLATE BINARY_CI Like 'IgNoReCaSe'
Run Code Online (Sandbox Code Playgroud)