考虑查询(它在Oracle和MySQL上运行)
UPDATE table1
SET something_id = CASE
WHEN table1_id = 1446 THEN 423
WHEN table1_id = 2372 THEN 426
WHEN table1_id = 2402 THEN 428
WHEN table1_id = 2637 THEN 429
WHEN table1_id = 2859 THEN 430
WHEN table1_id = 3659 THEN 433
END
WHERE table1_id IN (1446,2372,2402,2637,2859,3659)
这个查询可能会变得非常大,所以我想知道单个查询可以容纳的条件数(WHEN,THEN语句)的限制是多少。有办法吗?
例如:
我知道可传递给IN
的最大值数为1000,为了克服这一点,我们可以做到
`WHERE TABLE1_ID IN ([1000 values]) OR TABLE1_ID IN ([more values])`
答案 0 :(得分:12)
将您的信件放入帮助表中:
id value
1446 423
2372 426
…
并加入。
在Oracle
:
UPDATE (
SELECT something_id, value
FROM table1
JOIN helper
ON table1.table1_id = helper.id
)
SET something_id = value
(不要忘记让helper.id
成为PRIMARY KEY
,以便此工作)
在MySQL
:
UPDATE table1
JOIN helper
ON table1.table1 = helper.id
SET table1.something_id = value
答案 1 :(得分:7)
如果您有很多这样的案例陈述,您应该将它们移到表格中以简化:
NewTable
table1_id | result
-----------+---------
1446 | 423
2372 | 426
... | ...
然后在您的查询中加入:
UPDATE table1
SET something_id = NewTable.result
INNER JOIN NewTable
ON table1.table1_id = NewTable.table1_id
这简单得多。
答案 2 :(得分:7)
10gR2的文档说:
a中的最大参数数量 CASE表达式为255.全部 表达式计入此限制, 包括a的初始表达式 简单的CASE表达式和 可选的ELSE表达式。每个时间 ......然后这两个参数就算了。 为避免超出此限制,您可以 嵌套CASE表达式使 return_expr本身就是一个CASE 表达
答案 3 :(得分:4)
在MySQL中,您仅受限于查询的字节大小。这由服务器的“max_allowed_packet”设置控制。我不能代表甲骨文。