我希望在我的SQL server查询中使用从用户记录的WHERE子句basis @USER_ID输入时设置一个条件,但是我想我在这里遗漏了一些重要的东西。
DECLARE @USER_ID NVARCHAR(255) = 'a,b,c' -- will be multi-select parameter; can be null as well
select * from <table_name>
{
if: @USER_ID is NULL then no WHERE condition
else: WHERE <table_name>.<col_name> in (SELECT item FROM SplitString(@USER_ID,','))
}有人能帮帮忙吗?
发布于 2021-11-26 09:23:59
就我个人而言,我建议切换到表类型参数,这样就完全不需要使用STRING_SPLIT了。不过,我不打算在这里介绍上述类型的参数的创建;已经有很多参数的创建,文档也足以解释它。
至于问题,如果我们要使用STRING_SPLIT,您将使用如下所示的方法:
SELECT {Your Columns} --Don't use *
FROM dbo.YourTable YT
WHERE YT.YourColumn IN (SELECT SS.Value
FROM STRING_SPLIT(@USER_ID,',') SS)
OR @USER_ID IS NULL
OPTION (RECOMPILE);OPTION子句中的RECOMPILE很重要,因为@USER_ID具有值NULL的查询可能与没有值的查询非常不同。
您可以使用动态SQL方法,但是对于一个参数,我怀疑除了可以忽略不计的好处之外,还会有更多的东西。使用上面的方法也更容易让其他人理解,对于这样一个简单的查询,每次运行查询时生成计划的成本应该很小。
通过使用表类型参数,使用如下所示的UNION ALL查询实际上可能会更有性能(假设您在YourColumn上有一个可用的索引):
SELECT {Your Columns} --Don't use *
FROM dbo.YourTable YT
JOIN @Users U ON YT.YourColumn = U.UserId
UNION ALL
SELECT {Your Columns} --Don't use *
FROM dbo.YourTable YT
WHERE NOT EXISTS (SELECT 1 FROM @Users U);发布于 2021-11-26 09:04:34
你可以在这里完全避免使用STRING_SPLIT:
WHERE ',' + @USER_ID + ',' LIKE '%,' + <table_name>.<col_name> + ',%'发布于 2021-11-26 13:36:46
如果@UserID为NULL,则执行条件(1=1),这始终为真。如果@UserID不为NULL,则执行OR条件,其中(a,b,c)中的所有都存在。
SELECT *
FROM <table_name>
WHERE (1=1)
AND ((@USER_ID IS NULL AND (1=1)) -- always true
OR (<table_name>.<col_name> in (SELECT [value] FROM SplitString(@USER_ID,',')))
)https://stackoverflow.com/questions/70121844
复制相似问题