SQL:限制CASE(WHEN,THEN条件的数量)

时间:2009-07-21 17:04:29

标签: sql mysql oracle

考虑查询(它在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])`

4 个答案:

答案 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_pa​​cket”设置控制。我不能代表甲骨文。