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
答案 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是我做的测试,我希望有帮助:)