我们今天的制作中遇到了一些有趣的问题:)现在一切都很好但我还是不了解一件事。让我告诉你这个问题。
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()
方法?
感谢任何答案。
答案 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将匹配给定文本之前或之后的任意数量的空格。 (请注意,在上面的示例中,方括号之间有一个空格。