我的名字和姓氏后面都有空格。我有两个SQL查询-即使我没有空格搜索,第一个查询也会返回结果。(第一个查询返回了不想要的结果)。
msdn
SQL Server 2008 R2
代码
DECLARE @NameTable TABLE (first_name varchar(40),last_name varchar(40)) INSERT INTO @NameTable VALUES ('STEVEN ','STANLEY '); --QUERY 1 SELECT first_name AS [FirstName], last_name AS [LastName] FROM @NameTable A WHERE (first_name = 'STEVEN') AND (last_name = 'STANLEY') --QUERY 2 SELECT first_name AS [FirstName], last_name AS [LastName] FROM @NameTable A WHERE (( ISNULL(first_name,'')+' ' +ISNULL(last_name,'') ) = 'STEVEN STANLEY') --QUERY 3 (With LTRIM and RTRIM) SELECT first_name AS [FirstName], last_name AS [LastName] FROM @NameTable A WHERE (( ISNULL(LTRIM(RTRIM(first_name)),'')+' ' +ISNULL(LTRIM(RTRIM(last_name)),'') ) = 'STEVEN STANLEY')
请参阅http://support.microsoft.com/kb/316626
SQL Server遵循有关如何将字符串与空格进行比较的ANSI / ISO SQL-92规范(第8.2节,通用规则#3)。ANSI标准要求对比较中使用的字符串进行填充,以便它们的长度在比较之前匹配。填充直接影响WHERE和HAVING子句谓词的语义以及其他Transact- SQL字符串比较。例如,Transact-SQL认为字符串“ abc”和“ abc”在大多数比较操作中是等效的。 该规则的唯一例外是LIKE谓词。当LIKE谓词表达式的右侧具有带尾随空格的值时,在进行比较之前,SQL Server不会将两个值填充为相同的长度。因为按照定义,LIKE谓词的目的是为了促进模式搜索,而不是简单的字符串相等性测试,所以这不违反前面提到的ANSI SQL-92规范的部分。
SQL Server遵循有关如何将字符串与空格进行比较的ANSI / ISO SQL-92规范(第8.2节,通用规则#3)。ANSI标准要求对比较中使用的字符串进行填充,以便它们的长度在比较之前匹配。填充直接影响WHERE和HAVING子句谓词的语义以及其他Transact- SQL字符串比较。例如,Transact-SQL认为字符串“ abc”和“ abc”在大多数比较操作中是等效的。
该规则的唯一例外是LIKE谓词。当LIKE谓词表达式的右侧具有带尾随空格的值时,在进行比较之前,SQL Server不会将两个值填充为相同的长度。因为按照定义,LIKE谓词的目的是为了促进模式搜索,而不是简单的字符串相等性测试,所以这不违反前面提到的ANSI SQL-92规范的部分。
如果要避免这种情况,可以添加一个加法条件,如下所示
参考:DataLength
SELECT first_name AS [FirstName], last_name AS [LastName],first_name+last_name,LEN(first_name+last_name) FROM @NameTable A WHERE (first_name = 'STEVEN') and DATALENGTH(first_name)=DATALENGTH(RTRIM(first_name)) AND (last_name = 'STANLEY') and DATALENGTH(last_name)=DATALENGTH(RTRIM(last_name))