【问题标题】:Using comma separated integer as string in where clause inside sub query在子查询的 where 子句中使用逗号分隔的整数作为字符串
【发布时间】:2018-02-15 09:55:34
【问题描述】:

我有一个存储过程,其中包含逗号分隔值 (codeid) 的列(例如 ('20045,20069,20079') 用于主选择语句的子查询内的 where in 子句。我尝试了一些解决方法,但找不到合适的解决方案。

这是我的代码:

    SELECT 
        CodeID, Name,
        Experience,
        (SELECT COALESCE(@CodeDescription + '', '', '''') + CAST([Description] AS varchar(100)) 
         FROM SynCode 
         WHERE CodeID IN (SELECT * 
                          FROM dbo.fnSplitString(codeid, ','))) AS [codeDescription]
    FROM   
        Code
WHERE CodeIdentity = 1

这里SynCode 包含每个代码的描述,dnSplitString 是一个将 CSV 整数字符串转换为表格的函数。

在执行上述语句时,我收到以下错误:

子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。

对此的任何帮助将不胜感激。

由于我只需要返回一行,因此我使用 COALESCE 以逗号分隔值

编辑: 我有

    CodeID as '20045,20069,20079'
    and Iam Expecinting row result as
20045,20069,20079|Marry|2 years|Finance, Retail, Sales

编辑:CodeID、Name、Experience 为 VARCHAR,SynCode 中的 CodeID 为 Int

【问题讨论】:

  • 也许你正在寻找FOR XML
  • 这里的信息再清楚不过了。您的子查询返回超过 1 行。那将是您在那里的专栏。顺便说一句,作为列的子查询几乎总是一个坏主意。您应该改用连接。这也是为什么存储这样的分隔字符串是一个坏主意的另一个原因。如果您的数据被正确规范化,那么这里根本不会有问题。
  • 您要么需要将数组拆分为值表(最好),要么使用动态 sql。
  • 不...如果您在 SynCode 中有两行,因为 codeid 有两个值,您将返回两行。该 select 语句不会生成 csv,相反,它将 csv 拆分为行。因此出现错误消息。
  • 我不确定你希望从子查询中得到什么,所以很难给出答案。

标签: sql sql-server database


【解决方案1】:

问题是

当子查询用作表达式时。

您不能将查询放在 Selectstatement 中,因为它返回多个元素。

尝试以下方法:

SELECT 
    CodeID, Name,
    Experience,
    (SELECT STRING_AGG(Description, ', ') 
     FROM SynCode 
     WHERE CodeID IN (SELECT * 
                      FROM dbo.fnSplitString(codeid, ','))) AS [codeDescription]
FROM   
    Code
WHERE CodeIdentity = 1

让我知道它是否有效。

干杯。

【讨论】:

  • 我确定 OP 不希望将交叉连接作为解决方案。至少加入 codeid。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-27
  • 1970-01-01
  • 2012-07-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多