为什么 SQL 服务器在我使用 LIKE 运算符时出错?
Why SQL Server has error when i use LIKE operator?
我想select名第三个字是'l'的员工(如下图)
执行后,有4条正确记录,1条错误记录。
我不明白为什么名字是 'Philip' 而 l 是第四个字符的记录是 selected?
My SQL Statements
您的数据
declare @employee TABLE (
fname VARCHAR(20) NOT NULL
,lname VARCHAR(20) NOT NULL
);
INSERT INTO @employee(fname,lname) VALUES ('Helen','Bennett');
INSERT INTO @employee(fname,lname) VALUES ('Helvetius','Nagy');
INSERT INTO @employee(fname,lname) VALUES ('Palle','Ibsen');
INSERT INTO @employee(fname,lname) VALUES ('Philip','Cramer');
INSERT INTO @employee(fname,lname) VALUES ('Roland','Mendel');
使用 CHARINDEX 和 SUBSTRING 在列中搜索特定字符会好得多。此外,您必须在 table 中选择最佳整理(数据的排序规则、大小写和区分重音的属性),例如 COLLATE SQL_Latin1_General_CP1_CS_AS
子串
select concat(fname,' ',lname) as fullname
FROM @employee e
where SUBSTRING(fname, 3, 1)='l' and fname SQL_Latin1_General_CP1_CS_AS
ORDER BY e.fname
CHARINDEX
select concat(fname,' ',lname) as fullname
FROM @employee e
where CHARINDEX('l', fname) = 3 and fname SQL_Latin1_General_CP1_CS_AS
ORDER BY e.fname
是的,这是一个特定于 COLLATION 的问题,那些乱给负面评价的人应该多想想,而不是本能地投票!
使用 Vietnamese_100_... 归类(我认为我们的用户 HaNgocHieu 就是这种情况)或其他一些归类如 Welsh_100... Ph 两个字母被视为只有一个,结果是查询 returns 也是 Philip.
作为测试:
CREATE TABLE #employee
( fname VARCHAR(20) NOT NULL,
lname VARCHAR(20) NOT NULL);
INSERT INTO #employee(fname,lname)
VALUES ('Philip','Cramer');
SELECT *
FROM #employee e
where fname + lname COLLATE Vietnamese_CI_AI LIKE '__l%';
fname lname
-------------------- --------------------
Philip Cramer
SELECT *
FROM #employee e
where fname + lname COLLATE French_CI_AI LIKE '__l%';
fname lname
-------------------- --------------------
SELECT *
FROM #employee e
where fname + lname COLLATE Welsh_100_CI_AI LIKE '__l%';
fname lname
-------------------- --------------------
Philip Cramer
所以SQL服务器没有错误,HaNgocHieu也没有出错,但是使用非特定数据的特定排序规则可能会导致一些问题,可以使用像拉丁语中的国际排序规则来解决
我想select名第三个字是'l'的员工(如下图) 执行后,有4条正确记录,1条错误记录。 我不明白为什么名字是 'Philip' 而 l 是第四个字符的记录是 selected?
My SQL Statements
您的数据
declare @employee TABLE (
fname VARCHAR(20) NOT NULL
,lname VARCHAR(20) NOT NULL
);
INSERT INTO @employee(fname,lname) VALUES ('Helen','Bennett');
INSERT INTO @employee(fname,lname) VALUES ('Helvetius','Nagy');
INSERT INTO @employee(fname,lname) VALUES ('Palle','Ibsen');
INSERT INTO @employee(fname,lname) VALUES ('Philip','Cramer');
INSERT INTO @employee(fname,lname) VALUES ('Roland','Mendel');
使用 CHARINDEX 和 SUBSTRING 在列中搜索特定字符会好得多。此外,您必须在 table 中选择最佳整理(数据的排序规则、大小写和区分重音的属性),例如 COLLATE SQL_Latin1_General_CP1_CS_AS 子串
select concat(fname,' ',lname) as fullname
FROM @employee e
where SUBSTRING(fname, 3, 1)='l' and fname SQL_Latin1_General_CP1_CS_AS
ORDER BY e.fname
CHARINDEX
select concat(fname,' ',lname) as fullname
FROM @employee e
where CHARINDEX('l', fname) = 3 and fname SQL_Latin1_General_CP1_CS_AS
ORDER BY e.fname
是的,这是一个特定于 COLLATION 的问题,那些乱给负面评价的人应该多想想,而不是本能地投票!
使用 Vietnamese_100_... 归类(我认为我们的用户 HaNgocHieu 就是这种情况)或其他一些归类如 Welsh_100... Ph 两个字母被视为只有一个,结果是查询 returns 也是 Philip.
作为测试:
CREATE TABLE #employee
( fname VARCHAR(20) NOT NULL,
lname VARCHAR(20) NOT NULL);
INSERT INTO #employee(fname,lname)
VALUES ('Philip','Cramer');
SELECT *
FROM #employee e
where fname + lname COLLATE Vietnamese_CI_AI LIKE '__l%';
fname lname
-------------------- --------------------
Philip Cramer
SELECT *
FROM #employee e
where fname + lname COLLATE French_CI_AI LIKE '__l%';
fname lname
-------------------- --------------------
SELECT *
FROM #employee e
where fname + lname COLLATE Welsh_100_CI_AI LIKE '__l%';
fname lname
-------------------- --------------------
Philip Cramer
所以SQL服务器没有错误,HaNgocHieu也没有出错,但是使用非特定数据的特定排序规则可能会导致一些问题,可以使用像拉丁语中的国际排序规则来解决