我需要在Ids的基础上更新表中的多行。在存储过程中,我正在创建一个包含Ids列表的varchar变量。
现在,在表中我有Ids 1,2的条目.varchar变量的值为1,2
;所以我期待下面的查询不会更新任何行。
UPDATE mytbl
SET flag = 1
WHERE Id IN (IdList); -- Here IdList has value '1,2'
但此处ID为2
的行正在更新。选择查询也返回相同的行。
我尝试将IdList
连接为"'1','2'"
,然后重新调整两行(包含ID 1和2)。
Id
的数据类型为int
。有没有正确的方法来维护整数列表?
答案 0 :(得分:10)
只需使用id作为整数:
UPDATE mytbl
SET flag = 1
WHERE id in (1,2,3,....)
答案 1 :(得分:3)
试试这个:
UPDATE mytbl
SET flag = 1
WHERE @IdList LIKE CONCAT('%,',Id,',%');
请注意,您的varchar列表@IdList
必须以逗号开头和结尾(例如,1,2,20,30,
)。
答案 2 :(得分:0)
动态生成子查询,其中列表不是VARCHAR而是查询文本的一部分。即用更高级的语言(perl / python / php)实现它。
答案 3 :(得分:0)
你应该尝试左连接,因为你得到一个ID的@table类型参数,这将给出快速和更可靠的结果:)
UPDATE
mytbl
SET
flag = 1
FROM
@IdList idL
LEFT JOIN mytbl mTbl ON mTbl.ID = idL.Table_ID
答案 4 :(得分:0)
这也有效,这里你不需要在定义变量的开头和结尾有逗号。
SET @IdList = "1,2";
UPDATE mytbl
SET flag = 1
WHERE FIND_IN_SET(Id, @IdList);