使用NLS_COMP = LINGUISTIC和NLS_SORT = BINARY_CI时喜欢

时间:2012-09-07 10:37:37

标签: sql oracle oracle11g sql-like

Oracle版本:11.2.0.2.0

我已设置NLS_COMP = 'LINGUISTIC'NLS_SORT = 'BINARY_CI'

每当我使用没有前导通配符(%)的LIKE比较时,它都不会返回正确的结果。 这是一个通用的例子。查询#3显然是我的问题。以前有人经历过吗?

CREATE TABLE People     
(      
  ID NUMBER(1,0),    
  FirstName NVARCHAR2(20),    
  LastName NVARCHAR2(20)
);    

INSERT INTO People (ID, FirstName, LastName) VALUES ('1', 'John', 'Doe');    
INSERT INTO People (ID, FirstName, LastName) VALUES ('2', 'Jane', 'Doe');    
INSERT INTO People (ID, FirstName, LastName) VALUES ('3', 'Rich', 'Donner');    
INSERT INTO People (ID, FirstName, LastName) VALUES ('4', 'Mike', 'Redoer');            

-- Query #1    
SELECT ID FROM People WHERE Lastname = 'doe';

-- Results (Correct)    
-- 1    
-- 2


-- Query #2    
SELECT ID FROM People WHERE Lastname LIKE '%doe%';

-- Results (Correct)    
-- 1    
-- 2    
-- 4


-- Query #3
SELECT ID FROM People WHERE Lastname LIKE 'do%';

-- Results (Incorrect)    
-- 1    
-- 2    
-- 3    
-- 4

1 个答案:

答案 0 :(得分:0)

查询3给出了这个,因为%%说:在字符串'do'之后找到任何姓氏包含0个或更多字符的人(这就是为什么你还要在那里得到Redoer ..)

你期望从Q3得到什么结果?

<强>更新

如果你只是想通过'do'开始 你可以尝试

LIKE '[d]o%';

更新2

进一步reading /测试后,我发现了你想要做什么(找到以'do'开头的任何东西),你真的不需要NLS_SORT ='BINARY_CI',因为这个将排序设置为不区分大小写,我们失去了使用Caps中的第一个字母并且搜索被搞砸的优势。
因此,假设第一个字母在Cap中,您需要做的就是:

alter session set nls_comp='LINGUISTIC';  
SELECT ID FROM People WHERE Lastname LIKE 'Do%';

ID
1
2
3

Here是我做的测试,我希望有帮助:)