我想知道为什么SQL中的这两个条件会返回不同的结果
第一个条件
我写的查询如下:
DECLARE @idUser VARCHAR(MAX)
SELECT @idUser = COALESCE(@idUser+', ' , '') + CAST(idUser as VARCHAR(MAX))
FROM webuser
WHERE username IN ('John', 'Tom')
它返回每个用户名的用户ID,下面是给定的输出
1020, 1021
第二个条件
我写了另一个不同的查询。用户名已经设置为参数,这实际上是我需要的,用户名设置为参数,下面是使用的查询:
DECLARE @username VARCHAR(MAX)
SET @username = '''John'', ''Tom'''
DECLARE @idUser VARCHAR(MAX)
SELECT @idUser = COALESCE(@idUser+', ' , '') + CAST(idUser as VARCHAR(MAX))
FROM webuser
WHERE username IN (@username)
结果返回NULL
值。
我期待这两个查询返回相同的输出,我认为这是关于@username
中的引用,我做错了还是你们对这个案例有任何解释和解决方案?
答案 0 :(得分:2)
@username是单个字符串变量,而不是字符串数组。因此,您替换变量的查询是在表中查找值为'John', 'Tom'
的单个用户名,而不是两个单独的值'John'
和'Tom'
... SQL Server不知道数组是什么,并且无法将该字符串转换为多个值。
您需要先使用动态SQL或拆分值。
动态SQL:
DECLARE
@s VARCHAR(MAX),
@username VARCHAR(MAX);
SELECT
@s = '',
@username = '''John'', ''Tom''';
DECLARE @sql NVARCHAR(MAX);
SELECT @sql = N'SELECT @s = @s + '',''
+ CONVERT(VARCHAR(MAX), idUser)
FROM dbo.webuser
WHERE username IN (' + @username + ');';
EXEC sp_executesql
@sql,
N'@s VARCHAR(MAX) OUTPUT',
@s = @s OUTPUT;
PRINT STUFF(@s, 1, 1, '');
有关分裂的一些想法:Passing a varchar full of comma delimited values to a SQL Server IN function
答案 1 :(得分:1)
您的第二个条件是尝试查找不存在的单个用户名“'John', 'Tom'
”。为了在您的查询中以您想要的方式使用此字符串,您需要动态SQL,或者您可以使用LIKE,如:
DECLARE @username VARCHAR(MAX)
SET @username = '!John, !Tom'
DECLARE @idUser VARCHAR(MAX)
SELECT @idUser = COALESCE(@idUser+', ' , '') + CAST(idUser as VARCHAR(MAX))
FROM webuser
WHERE @username LIKE '%!'+username+'%'