【问题标题】:How to use the result of a stuff-function in an IN-Clause?如何在 IN 子句中使用填充函数的结果?
【发布时间】:2021-10-04 22:10:58
【问题描述】:

我想在 IN 子句中使用串联字符串的结果。

这是我的 SQL 查询:

UPDATE Customer
SET Agent = 'Test'
WHERE CAST(ID AS VARCHAR) IN (
        SELECT IIF((
                    SELECT WinnerID
                    FROM Customer
                    WHERE ID = '19560'
                    ) IS NULL, '19560', (
                    SELECT STUFF((
                                SELECT ',' + CAST(ID AS VARCHAR)
                                FROM Customer
                                WHERE WinnerID = '19560'
                                FOR XML PATH('')
                                ), 1, 1, '') --returns 19560, 19686
                    ))
        )

IIF 函数中表达式返回 false 的部分是问题所在。返回正确的值,但无法正确识别,因此不会更新表格。

这是带有一些示例日期的表结构

ID WinnerID CustomerName Agent
19560 19560 Carman Sansone NULL
19686 19560 Melania Snowden NULL
19404 NULL Esther Flansburg NULL
19405 NULL Maximo Schill NULL
20055 20055 Jeanice Moen NULL
20056 20055 Kraig Rochin NULL

WinnerID 是重复解析的结果。因此,拥有相同 WinnerID 的两个客户是同一个客户,应该分配到同一个代理。

有什么方法可以制定这部分查询,以便我可以使用 IN 子句?或者重新制定整个查询以达到预期的结果?

【问题讨论】:

  • 请在此处添加示例数据并向我们展示表结构。你甚至可能不需要在这里使用STUFF

标签: sql sql-server tsql in-clause


【解决方案1】:

您完全误解了IN 在这里的工作方式。 ID IN ('19560, 19686') 等同于 ID = '19560, 19686'。使用IN时需要返回一个数据集,或者提供一个列表。例如ID IN (19560, 19686)

没有必要使用FOR XML PATH不是STUFFSTUFF 所做的只是删除并用另一个字符串替换一个字符串中的字符长度;在这种情况下,您正在删除第一个字符,并将其替换为长度为零的字符串)以创建分隔列表,只需正确使用IN,如documentation所示。

这是对您想要的逻辑的一些猜测,因为(相对而言)这是一团糟,但也许您只是想要这个

UPDATE C
SET Agent = 'Test'
FROM Customer C
WHERE ID = 19560
   OR ID IN (SELECT sq.ID
             FROM Customer sq
             WHERE sq.WinnerID = 19560);

【讨论】:

    猜你喜欢
    • 2013-11-28
    • 2014-10-29
    • 2019-07-15
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 1970-01-01
    • 2012-05-26
    • 2018-06-08
    相关资源
    最近更新 更多