【问题标题】:SQL Server nvarchar comparison with empty spaceSQL Server nvarchar 与空白空间的比较
【发布时间】:2017-07-26 13:28:16
【问题描述】:

我们今天从生产中遇到了有趣的问题 :) 现在一切都很好,但我仍然不明白一件事。让我告诉你查询。

IF OBJECT_ID('tempdb.dbo.#results', 'U') IS NOT NULL
    DROP TABLE #results;

CREATE TABLE #results(
    [id] smallint,
    [name] nvarchar(128)
)
insert into #results values (1, 'JOHN NOWAK      '), (2, 'frog'), (3, 'wine')

declare @nazwa_p nvarchar(128) = 'JOHN NOWAK';

SELECT * FROM #results WHERE [name] = @nazwa_p
SELECT * FROM #results WHERE [name] like @nazwa_p

第一个查询结果是

1   JOHN NOWAK

第二个查询什么也没给我。这是为什么? = 运算符是否运行 RTRIM() 方法?

感谢您的任何回答。

【问题讨论】:

    标签: sql sql-server comparison


    【解决方案1】:

    在相等比较中忽略尾随空格。在您的like 子句中,您缺少%。我添加了一个新变量来展示如何做到这一点。

    IF OBJECT_ID('tempdb.dbo.#results', 'U') IS NOT NULL
        DROP TABLE #results;
    
    CREATE TABLE #results(
        [id] smallint,
        [name] nvarchar(128)
    )
    insert into #results values (1, 'JOHN NOWAK      '), (2, 'frog'), (3, 'wine')
    
    declare @nazwa_p nvarchar(128) = 'JOHN NOWAK';
    
    declare @nazwa_p2 nvarchar(128) = '%JOHN NOWAK%';
    
    SELECT * FROM #results WHERE [name] = @nazwa_p
    SELECT * FROM #results WHERE [name] like @nazwa_p2
    SELECT * FROM #results WHERE [name] like '%' +  @nazwa_p + '%'
    

    【讨论】:

    • 感谢您的回答。我们已经添加了通配符匹配 %。但是我们不知道在相等比较中会忽略尾随空格。我在文档中找不到这个:)
    • It's ANSI standards。如果您愿意,可以将您的实例设置为忽略空格
    【解决方案2】:

    当您使用等号 (=) 运算符时,SQL Server 会将两个值填充为等长。这也发生在其他运算符上,例如 HAVING 或 WHERE。请参阅 ANSI/ISO SQL-92 规范。

    like 运算符不进行填充。这是使用等于运算符和不带通配符的 LIKE 运算符之间的唯一区别。要获得相同的结果,您需要:

         SELECT * FROM #results WHERE [name] like CONCAT('[ ]',@nazwa_p,'[ ]')
    

    在这种情况下,LIKE 将匹配给定文本之前或之后的任意数量的空格。 (请注意,在上面的示例中,方括号之间有一个空格。

    【讨论】:

      猜你喜欢
      • 2014-09-28
      • 2011-03-18
      • 2018-10-02
      • 1970-01-01
      • 1970-01-01
      • 2012-08-24
      • 2017-09-22
      • 1970-01-01
      • 2016-06-09
      相关资源
      最近更新 更多