LIKE和其他比较操作符,= etc的默认行为区分大小写。

有没有可能让它们不区分大小写?


当前回答

也许你可以试试

SELECT user_name
FROM user_master
WHERE upper(user_name) LIKE '%ME%'

其他回答

也许你可以试试

SELECT user_name
FROM user_master
WHERE upper(user_name) LIKE '%ME%'

如果将COLLATE操作符放在表达式的末尾,它也可以工作,这对我来说似乎更干净。 所以你可以用这个:

WHERE name LIKE 'j%' COLLATE BINARY_CI 

而不是这样:

WHERE name COLLATE BINARY_CI LIKE 'j%'

无论如何,我喜欢COLLATE操作符解决方案的原因如下:

你只在表达式中放入一次,你不需要担心多个UPPER或LOWER,以及把它们放在哪里 它被隔离到您需要它的确切语句和表达式中,不像ALTER SESSION解决方案使它适用于所有事情。无论数据库或会话的NLS_SORT设置如何,您的查询都将始终工作。

在Oracle 12c R2中使用COLLATE操作符:

COLLATE操作符确定表达式的排序规则。此操作符使您能够覆盖数据库使用标准排序规则派生的表达式的排序规则。 COLLATE操作符接受一个参数collation_name,您可以为其指定命名排序规则或伪排序规则。如果排序规则名称包含空格,则必须将名称括在双引号中。

演示:

CREATE TABLE tab1(i INT PRIMARY KEY, name VARCHAR2(100));

INSERT INTO tab1(i, name) VALUES (1, 'John');
INSERT INTO tab1(i, name) VALUES (2, 'Joe');
INSERT INTO tab1(i, name) VALUES (3, 'Billy'); 
--========================================================================--
SELECT /*csv*/ *
FROM tab1
WHERE name = 'jOHN' ;
-- no rows selected

SELECT /*csv*/ *
FROM tab1
WHERE name COLLATE BINARY_CI = 'jOHN' ;
/*
"I","NAME"
1,"John"
*/

SELECT /*csv*/ *
FROM tab1 
WHERE name LIKE 'j%';
-- no rows selected

SELECT /*csv*/ *
FROM tab1 
WHERE name COLLATE BINARY_CI LIKE 'j%';
/*
"I","NAME"
1,"John"
2,"Joe"
*/

db < > fiddle演示

从10gR2开始,Oracle允许通过设置NLS_COMP和NLS_SORT会话参数来微调字符串比较的行为:

SQL> SET HEADING OFF
SQL> SELECT *
  2  FROM NLS_SESSION_PARAMETERS
  3  WHERE PARAMETER IN ('NLS_COMP', 'NLS_SORT');

NLS_SORT
BINARY

NLS_COMP
BINARY


SQL>
SQL> SELECT CASE WHEN 'abc'='ABC' THEN 1 ELSE 0 END AS GOT_MATCH
  2  FROM DUAL;

         0

SQL>
SQL> ALTER SESSION SET NLS_COMP=LINGUISTIC;

Session altered.

SQL> ALTER SESSION SET NLS_SORT=BINARY_CI;

Session altered.

SQL>
SQL> SELECT *
  2  FROM NLS_SESSION_PARAMETERS
  3  WHERE PARAMETER IN ('NLS_COMP', 'NLS_SORT');

NLS_SORT
BINARY_CI

NLS_COMP
LINGUISTIC


SQL>
SQL> SELECT CASE WHEN 'abc'='ABC' THEN 1 ELSE 0 END AS GOT_MATCH
  2  FROM DUAL;

         1

你也可以创建不区分大小写的索引:

create index
   nlsci1_gen_person
on
   MY_PERSON
   (NLSSORT
      (PERSON_LAST_NAME, 'NLS_SORT=BINARY_CI')
   )
;

此信息来自Oracle不区分大小写的搜索。文章提到了REGEXP_LIKE,但它似乎也适用于old =。


在10gR2以上的版本中,这实际上是做不到的,如果不需要不区分重音的搜索,通常的方法是对列和搜索表达式都使用UPPER()。

你可以这样做:

where regexp_like(name, 'string$', 'i');