1

甲骨文版本: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
4

1 回答 1

0

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

您对 Q3 的期望是什么?

更新

如果您只想从“做”开始,您可以尝试

LIKE '[d]o%';

更新 2

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

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

ID
1
2
3

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

于 2012-09-07T10:48:33.313 回答