我想選擇名字的第三個字符是'l'的員工(如下圖)執行后,有4個正確的記錄和1個不正確的記錄。我不明白為什么選擇了名字是'Philip'而l是第四個字符的記錄?
我的 SQL 陳述句
uj5u.com熱心網友回復:
是的,這是一個 COLLATION 特定的問題,那些不分青紅皂白地給予負面評價的人應該多考慮一下,而不是本能地投票!
使用 Vietnam_100_... 排序規則(我認為我們的用戶 HaNgocHieu 就是這種情況)或其他一些排序規則(如 Welsh_100...),Ph 兩個字母被視為只有一個,結果是查詢也回傳 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 Server 沒有錯誤,HaNgocHieu 也沒有犯任何錯誤,但是使用具有非特定資料的特定排序規則會導致一些問題,可以使用拉丁語中的國際排序規則來解決
uj5u.com熱心網友回復:
你的資料
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 在列中搜索特定字符會更好。此外,您必須在表中選擇最佳排序規則(排序規則、大小寫和區分重音屬性),例如 COLLATE SQL_Latin1_General_CP1_CS_AS SUBSTRING
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/430070.html
