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

Vir*_*aru 4 mysql sql 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)
Run Code Online (Sandbox Code Playgroud)

这个查询可能会变得非常大,所以我想知道单个查询可以容纳的条件数(WHEN,THEN语句)的限制是多少.有办法解决吗?

例如:
我知道可以传递给的最大值数IN是1000,我们可以做到这一点

`WHERE TABLE1_ID IN ([1000 values]) OR TABLE1_ID IN ([more values])`
Run Code Online (Sandbox Code Playgroud)

Qua*_*noi 12

将您的通信放入帮助表:

id   value

1446  423
2372  426 
…
Run Code Online (Sandbox Code Playgroud)

并加入.

Oracle:

UPDATE  (
        SELECT  something_id, value
        FROM    table1
        JOIN    helper
        ON      table1.table1_id = helper.id
        )
SET     something_id = value
Run Code Online (Sandbox Code Playgroud)

(别忘helper.idPRIMARY KEY为此工作)

MySQL:

UPDATE  table1
JOIN    helper
ON      table1.table1 = helper.id
SET     table1.something_id = value
Run Code Online (Sandbox Code Playgroud)


Wel*_*bog 7

如果你有很多像这样的case语句,你应该把它们移到一个表中来简化:

NewTable
table1_id  | result
-----------+---------
1446       | 423
2372       | 426
...        | ...
Run Code Online (Sandbox Code Playgroud)

然后在您的查询中加入它:

UPDATE table1
SET something_id = NewTable.result
INNER JOIN NewTable
ON table1.table1_id = NewTable.table1_id
Run Code Online (Sandbox Code Playgroud)

它简单得多.


ska*_*man 7

10gR2的文档说:

CASE表达式中的最大参数数为255.所有表达式都计入此限制,包括简单CASE表达式的初始表达式和可选的ELSE表达式.每个WHEN ... THEN对都算作两个参数.为避免超出此限制,可以嵌套CASE表达式,以便return_expr本身是CASE表达式.