在SQL中选择时是否可以进行转换?

时间:2017-03-05 17:15:21

标签: 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 
(CONVERT(NVARCHAR, CatID) IN (SELECT * FROM STRING_SPLIT(@Cat,'+'))

如果有另一种方法可以做到这一点,我愿意接受建议,或许可以直接分成整数?谢谢!

1 个答案:

答案 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。