在SQL中选择时是否可以转换?
我有一个简单的SQL查询,但输入参数是由多个值组成的字符串。我正试图让它工作,但可能我的语法是关闭的,或者它不可能像这样在SQL中选择时是否可以转换?,sql,sql-server,tsql,sql-server-2016,Sql,Sql Server,Tsql,Sql Server 2016,我有一个简单的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
(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,'+'))
如果有其他方法可以做到这一点,我愿意接受建议,也许可以直接拆分成整数?谢谢 如果您可以使用
FROM
子句中的别名指定调用string\u split()
的参数,那就太好了:
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);
嗯,我不确定这是否是“直接的”,但它不需要自定义项。您得到了什么错误?很抱歉,错误出现在其他地方。代码看起来像预期的那样工作。我正在尝试使用ss(val),但它给了我一个错误<代码>'STRING\u SPLIT'不是可识别的函数名。@MuffinMan。我用的是你问题中的语法。您可以轻松下载字符串拆分函数(google“sql server字符串拆分”)。调用函数时,需要包含架构名称。
STRING\u SPLIT
是内置函数,如果它们处于启用状态。@GordonLinoff STRING\u SPLIT工作正常,但一旦我在之后添加ss(val),它就会给出该错误。我甚至试过复制/粘贴你的第一个代码块,同样的错误。@MartinSmith我正在运行2016。