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

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


当前回答

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

WHERE name LIKE 'j%' COLLATE BINARY_CI 

而不是这样:

WHERE name COLLATE BINARY_CI LIKE 'j%'

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

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

其他回答

select user_name
from my_table
where nlssort(user_name, 'NLS_SORT = Latin_CI') = nlssort('%AbC%', 'NLS_SORT = Latin_CI')

你可以这样做:

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

如果将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演示

也许你可以试试

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