如果我想根据条件更新列值,我可以使用下面的查询来获得一个simpel +1 -1的情况(当然,转换为正确的PHP调用或等效的ORM):
UPDATE articles SET STATUS = 0 WHERE STATUS = 1;
但现在的问题是,我想根据原文status
,从字典中推断出status
的新值。假设字典是这样的:
dict['1']='3'
dict['12']='2'
dict['6']='2'
键值对之间没有关系。 dict
是一个PHP字典对象,这就是我所说的“in memory dictionary
”。
如何撰写此查询?
编辑:问题编辑。我没有正确构建问题......对不起!
答案 0 :(得分:4)
如果您的映射数量很少,那么您可以使用case
语句。
BEGIN TRAN
UPDATE articles
SET status =
case
when status=1 then 3
when status=12 or status=6 then 2
else status --leave it unchanged if it doesn't match a case
end
--COMMIT OR ROLLBACK
否则采用rwmnau
建议的映射表方法答案 1 :(得分:1)
使用子查询:
UPDATE articles AR SET status = (SELECT value FROM dict WHERE key = AR.status)
当然,我假设你的数据库中存有字典。
答案 2 :(得分:1)
这样的事情怎么样:
UPDATE articles
SET status = n.new
FROM articles a
JOIN NewStatus n
ON a.status = n.status
这样,您就有了第二个名为“NewStatus”的表,它有两列 - 一个名为“status”,具有您现有的状态,另一个名为“New”,具有您希望它更新的状态。加入该表,进行更新,这应该解决它。此外,如果您不想更新任何状态,只需将它们包含在NewStatus表中 - 然后在更新语句中跳过它们。
看起来问题已被修改,所以如果我错过了这一点,请告诉我!
答案 3 :(得分:1)
由于你的问题不清楚,你似乎在混合代码和SQL,你可以做这样的事情(伪Java):
StringBuilder sb = new StringBulder();
for (Map.Entry<Integer,Integer> entry : codes.entrySet) {
sb.append(
String.format("UPDATE articles SET Status=%s WHERE Status=%s\n", entry.getValue(), entry.getKey()
);
}
String sqlToExecute = sb.toString();
System.out.println(sqlToExecute);
这将为您提供执行以进行更改的SQL。如果这个代码更像是一个代码,那么就去掉String格式并改用预处理语句。