2009-07-21 53 views
3

考慮查詢(時,THEN條件號)(它運行在Oracle和MySQL的)SQL:限制對CASE

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

WHERE子句是不必要的 - 您已經通過CASE語句中的table1_id進行篩選。 – 2009-07-21 17:13:22

+7

WHERE子句是絕對必要的。沒有它,你會更新表中的每一行,CASE語句中沒有具體提到的那些TABLE1_ID行將被設置爲NULL。至少,這是你在Oracle中的行爲 - 我無法想象MySQL在這方面與衆不同。 – 2009-07-21 17:58:47

回答

7

該文檔爲10gR2說:

的參數在一個 CASE表達式的最大數目是255。所有 表達式計入此限制, 包括 簡單CASE表達式和初始表達 可選的ELSE表達式。每個WHEN ...... THEN對就是兩個參數。 爲避免超出此限制,您可以使用 嵌套CASE表達式,以便 return_expr本身是CASE 表達式。

4

在MySQL中,你通過字節所限制查詢的大小。這由服務器的「max_allowed_pa​​cket」設置控制。我不能爲甲骨文發言。

+0

甚至沒有upvote?我回答了與MySQL相關的問題:-( – hobodave 2009-07-21 22:37:52

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 
+0

你打敗了我26秒...有時我想知道你是怎麼做到的。 – Welbog 2009-07-21 17:12:24

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 

這是一個簡單得多。