SQL: ограничение на CASE (число условий WHEN, THEN) - PullRequest
4 голосов
/ 21 июля 2009

Рассмотрим запрос (он работает как на 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 ]

12 голосов
/ 21 июля 2009

Положите ваши соответствия в таблицу помощников:

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 a PRIMARY KEY, чтобы это работало)

В MySQL:

UPDATE  table1
JOIN    helper
ON      table1.table1 = helper.id
SET     table1.something_id = value
7 голосов
/ 21 июля 2009

Документы для 10gR2 говорят:

Максимальное количество аргументов в CASE выражение 255. Все выражения рассчитывают к этому пределу, в том числе начальное выражение простое выражение CASE и необязательное выражение ELSE. Каждый КОГДА ... ТОГДА пара считается двумя аргументами. Чтобы избежать превышения этого лимита, вы можете Гнездо CASE выражений, так что Сам по себе return_expr является CASE выражение.

7 голосов
/ 21 июля 2009

Если у вас много таких примеров, вы должны переместить их в таблицу, чтобы упростить задачу:

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

Это намного проще.

4 голосов
/ 21 июля 2009

В MySQL вы ограничены только байтовым размером запроса. Это контролируется настройкой «max_allowed_packet» для вашего сервера. Я не могу говорить за Oracle.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...