如何在 IN 子句中使用填充函数的结果?
How to use the result of a stuff-function in an IN-Clause?
我想在 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 函数中表达式 returns false 的部分是问题所在。返回了正确的值,但无法正确识别它们,因此 table 未更新。
这是 table 结构,带有一些样本日期
ID
获奖者ID
客户姓名
代理
19560
19560
卡曼桑松
空
19686
19560
梅拉尼娅·斯诺登
空
19404
空
以斯帖弗兰斯堡
空
19405
空
马克西莫·席尔
空
20055
20055
珍妮丝·摩恩
空
20056
20055
克雷格·罗钦
空
WinnerID 是重复解析的结果。因此,具有相同 WinnerID 的两个客户是同一客户,应分配相同的代理。
有什么方法可以表达这部分查询以便我可以使用 IN 子句?或者重新制定整个查询以获得预期的结果?
您完全误解了 IN
在这里的工作原理。 ID IN ('19560, 19686')
等同于 ID = '19560, 19686'
。使用 IN
时,您需要 return 一个数据集,或提供一个列表。例如 ID IN (19560, 19686)
.
不需要使用FOR XML PATH
(不是 STUFF
,STUFF
所做的只是删除和替换一段字符字符串与另一个字符串;在这种情况下,您要删除第一个字符,并将其替换为零长度字符串)以创建分隔列表,只需正确使用 IN
,如 documentation.[= 所示21=]
这是对你想要的逻辑的一些猜测,因为(尊重)它是一团糟,但也许你只是想要这个
UPDATE C
SET Agent = 'Test'
FROM Customer C
WHERE ID = 19560
OR ID IN (SELECT sq.ID
FROM Customer sq
WHERE sq.WinnerID = 19560);
我想在 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 函数中表达式 returns false 的部分是问题所在。返回了正确的值,但无法正确识别它们,因此 table 未更新。
这是 table 结构,带有一些样本日期
ID | 获奖者ID | 客户姓名 | 代理 |
---|---|---|---|
19560 | 19560 | 卡曼桑松 | 空 |
19686 | 19560 | 梅拉尼娅·斯诺登 | 空 |
19404 | 空 | 以斯帖弗兰斯堡 | 空 |
19405 | 空 | 马克西莫·席尔 | 空 |
20055 | 20055 | 珍妮丝·摩恩 | 空 |
20056 | 20055 | 克雷格·罗钦 | 空 |
WinnerID 是重复解析的结果。因此,具有相同 WinnerID 的两个客户是同一客户,应分配相同的代理。
有什么方法可以表达这部分查询以便我可以使用 IN 子句?或者重新制定整个查询以获得预期的结果?
您完全误解了 IN
在这里的工作原理。 ID IN ('19560, 19686')
等同于 ID = '19560, 19686'
。使用 IN
时,您需要 return 一个数据集,或提供一个列表。例如 ID IN (19560, 19686)
.
不需要使用FOR XML PATH
(不是 STUFF
,STUFF
所做的只是删除和替换一段字符字符串与另一个字符串;在这种情况下,您要删除第一个字符,并将其替换为零长度字符串)以创建分隔列表,只需正确使用 IN
,如 documentation.[= 所示21=]
这是对你想要的逻辑的一些猜测,因为(尊重)它是一团糟,但也许你只是想要这个
UPDATE C
SET Agent = 'Test'
FROM Customer C
WHERE ID = 19560
OR ID IN (SELECT sq.ID
FROM Customer sq
WHERE sq.WinnerID = 19560);