【问题标题】:Is it possible to convert while selecting in SQL?在 SQL 中选择时是否可以转换?
【发布时间】:2017-03-05 17:15:20
【问题描述】:

我有一个简单的 SQL 查询,但输入参数是一个包含多个值的字符串。我正在尝试让它工作,但也许我的语法已关闭或者不可能像这样?

SELECT * 
FROM Table
WHERE CatID IN 
(SELECT CONVERT(TINYINT,value) FROM STRING_SPLIT(@Cat,'+'))

其中@Cat = '13+14+15'CatIDtinyint 类型。我也尝试过使用CONVERT(TINYINT,*),但没有运气。 以前我使用以下代码,但由于其他复杂性而希望切换它。

SELECT * 
FROM Table
WHERE CatID IN 
(CONVERT(NVARCHAR, CatID) IN (SELECT * FROM STRING_SPLIT(@Cat,'+'))

如果有其他方法可以做到这一点,我愿意接受建议,也许以某种方式直接拆分成整数?谢谢!

【问题讨论】:

  • 你遇到了什么错误?
  • 抱歉,错误出现在上游其他地方。代码似乎按预期工作。

标签: sql sql-server tsql sql-server-2016


【解决方案1】:

如果您可以在 FROM 子句中使用别名指定调用 string_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);

好吧,我不确定这是否“直接”,但它不需要 UDF。

【讨论】:

  • 我正在尝试使用 ss(val) 但它给了我一个错误。 'STRING_SPLIT' is not a recognized function name.
  • @MuffinMan 。 . .我正在使用您问题中的语法。您可以轻松下载字符串拆分功能(谷歌“sql server string split”)。调用函数时,需要包含架构名称。
  • STRING_SPLIT 是 2016 年的内置函数。
  • @GordonLinoff STRING_SPLIT 工作正常,但一旦我添加 ss(val) 之后,它就会给出该错误。我什至尝试复制/粘贴你的第一个代码块,同样的错误。
  • @MartinSmith 我跑 2016 年。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-16
  • 2012-08-13
  • 1970-01-01
相关资源
最近更新 更多