SELECT au_lname, au_fname
FROM authors
WHERE au_lname = 'Green '
au_lname au_fname ---------------------------------------- -------------------- Green Marjorie
SELECT au_lname, au_fname
FROM authors
WHERE au_lname LIKE 'Green '
au_lname au_fname ---------------------------------------- --------------------
有人可以解释一下,为什么第二个查询没有返回预期的行?
答案 0 :(得分:4)
这显然是标准的一个怪癖。也可能是明确的:
SQL Server遵循ANSI / ISO SQL-92 规范(第8.2节, ,关于如何比较字符串和空格的一般规则#3)。 ANSI标准要求 填充所用的字符串 比较使他们的长度 在比较之前匹配。该 填充直接影响语义 WHERE和HAVING子句谓词 和其他Transact-SQL字符串 比较。例如, Transact-SQL认为字符串'abc'和'abc'是等价的用于大多数比较 操作
此规则的唯一例外是LIKE谓词。当右侧 一个LIKE谓词表达式以a为特色 带有尾随空格的值,SQL 服务器不会将这两个值填充到 比较前的长度相同 发生。因为的目的 根据定义,LIKE谓词是 促进模式搜索 比简单的字符串相等测试, 这不违反 ANSI SQL-92规范 前面提到的。
奇怪 - 考虑到“平等”和“喜欢”这两个词,我原本以为后者会更自由。
答案 1 :(得分:1)
你的char(8)文字'Green'值会自动转换为与au_lname
列相同的数据类型,这很可能是varchar(),因此在转换中会删除尾随空格。这可能是优化器正在尝试使数据类型相同,因此可以使用索引。
SELECT au_lname, au_fname
FROM authors
WHERE au_lname = 'Green ' --auto conversion to varchar() is 'Green'
使用LIKE,CHAR(8)'Green'值没有自动转换,因此找不到匹配项。最有可能的是,这样做了,因此保留了模式匹配功能。如果您要搜索与LIKE 'xyz% '
LIKE 'xyz%'
SELECT au_lname, au_fname
FROM authors
WHERE au_lname LIKE 'Green ' --no conversion, remains CHAR(8) 'Green '
答案 2 :(得分:0)
这取决于存储的填充。
LIKE 'Green%'
和= 'Green'
都会找到“绿色”,而LIKE 'Green '
则找不到“绿色”但LIKE 'Green%'
会找到“绿色”。 '%Green%'会找到'绿色','先生Green','Green','Green','Green Ghost'和'Greentree'
注意:大多数sql实际上都匹配案例 - 以及:'GreeN','green''GREEN'全部匹配='Green'。