我有一个简单的SQL查询,但输入参数是一个包含多个值的字符串。我试图让这个工作,但也许我的语法已关闭或者不可能这样吗?
SELECT *
FROM Table
WHERE CatID IN
(SELECT CONVERT(TINYINT,value) FROM STRING_SPLIT(@Cat,'+'))
其中@Cat = '13+14+15'
和CatID
的类型为 tinyint 。我也尝试过使用CONVERT(TINYINT,*)
而没有运气。
以前我使用的是以下代码,但由于其他复杂情况,我希望将其切换。
SELECT *
FROM Table
WHERE CatID IN
(CONVERT(NVARCHAR, CatID) IN (SELECT * FROM STRING_SPLIT(@Cat,'+'))
如果有另一种方法可以做到这一点,我愿意接受建议,或许可以直接分成整数?谢谢!
答案 0 :(得分:1)
如果您可以使用string_split()
子句中的别名指定FROM
的参数,那将会很好:
SELECT t.*
FROM Table t
WHERE t.CatID IN (SELECT CONVERT(TINYINT, val)
FROM STRING_SPLIT(@Cat, '+') ss(val)
);
但语法似乎并不允许这样做。您的子查询解决方案似乎是更好的解决方案,尽管我会将其包装在CTE中。
您可以使用递归CTE直接拆分为整数:
with cte as (
select convert(tinyint, left(@cat + '+', charindex('+', @cat) - 1)) as val,
substring(@cat, charindex('+', @cat + '+') + 1, len(@cat)) as rest
union all
select convert(tinyint, left(rest + '+', charindex('+', rest) - 1)),
substring(rest, charindex('+', rest + '+') + 1, len(rest))
from cte
)
select t.*
from table t
where t.catid in (select val from cte);
嗯,我不确定这是"直接",但它并不需要UDF。