SQL Server WHERE条件不考虑空格

时间:2012-12-18 12:40:47

标签: sql sql-server sql-server-2008 sql-server-2008-r2

我的名字和姓氏带有尾随空格。我有两个SQL查询 - 即使我搜索没有空格,第一个查询返回结果。 (第一个查询返回不需要的结果)。

  1. 在所有版本的SQL Server中,此行为是否一致?
  2. 这是一种已知行为吗?它是否记录在msdn SQL Server 2008 R2的任何位置?
  3. CODE

    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')
    

    参考

    1. DataLength
    2. In SQL Server 2005, what is the difference between len() and datalength()?

2 个答案:

答案 0 :(得分:5)

参考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规范的部分。

如果您想避免这种情况,可以添加一个添加条件,如下所示

参考: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))

答案 1 :(得分:2)

我不能说我有一些与字符串与尾随空格的比较相关的东西--- http://support.microsoft.com/kb/316626

(编辑)

你能检查一下这段代码吗?

SELECT first_name AS [FirstName], last_name AS [LastName]
FROM  @NameTable A
WHERE (left(first_name,6) = 'STEVEN')+' '+(right(last_name,6) = 'STANLEY')

(对于6个字符的名称)