SQL Server nvarchar与空白空间的比较

时间:2017-07-26 13:28:16

标签: sql sql-server comparison

我们今天的制作中遇到了一些有趣的问题:)现在一切都很好但我还是不了解一件事。让我告诉你这个问题。

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()方法?

感谢任何答案。

2 个答案:

答案 0 :(得分:2)

在等式比较中忽略尾随空格。在您的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 + '%'

答案 1 :(得分:1)

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

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

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

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