Возможно ли иметь оператор IF внутри SET? - PullRequest
0 голосов
/ 06 июля 2018

У меня есть таблица в Oracle со столбцом с именем ERROR_CODE (который является VARCHAR2), изначально установленным на NULL для каждого значения. Я хотел бы обновить его с помощью оператора UPDATE, как в следующем утверждении:

UPDATE SNAPSHOT_TEST
SET ERROR_CODE = 
  IF(...) THEN NVL2(ERROR_CODE, CONCAT(ERROR_CODE, ',8'), '9')
    ELIF(...) THEN NVL2(ERROR_CODE, CONCAT(ERROR_CODE, ',9'), '9') 
    ELIF(...) ...
  END IF;

Я пытался использовать оператор CASE для достижения этого результата, и он работает, но это не то, что мне нужно, потому что несколько условий могут совпадать одновременно, и если это происходит, мне нужно объединить код ошибки, как в операторе Я вставил раньше, имея «8,9» в конце, например. Есть ли способ добиться этого в Oracle?

Ответы [ 4 ]

0 голосов
/ 06 июля 2018

Несколько условий могут совпадать одновременно, и если это произойдет, мне нужно объединить код ошибки

Итак, объедините коды ошибок с выражением регистра, решающим, нужен ли каждый из них:

update snapshot_test
set error_code = 
  ltrim(
    case when (...) then ',8' end
    || case when (...) then ',9' end
    || case when (...) then ',10' end
    ...
    , ',');

Поскольку все они добавляют запятую, ltrim удаляет лишнюю, созданную первым совпадением.

db <> fiddle demo с совершенно произвольными и искусственными условиями, поскольку нам не с чем реально работать.

(С некоторым запозданием я понимаю, что это в значительной степени то, что делает правка @ LukaszSzozda, за исключением того, что включает запятые.)

0 голосов
/ 06 июля 2018

Мне удалось найти решение самостоятельно: даже если вопрос Лукаша после его редактирования действительно может работать, в этом случае более эффективно иметь отдельный UPDATE в каскаде, как в следующем фрагменте:

UPDATE SNAPSHOT_TEST
SET ERROR_CODE = NVL2(ERROR_CODE, CONCAT(ERROR_CODE, ',8'), '8')
WHERE (...);

UPDATE SNAPSHOT_TEST
SET ERROR_CODE = NVL2(ERROR_CODE, CONCAT(ERROR_CODE, ',9'), '9')
WHERE (...);

Таким образом, если ERROR_CODE равно NULL, оно будет установлено в первый раз при сопоставлении первого значения, в противном случае будет добавлен другой код ошибки с запятой.

0 голосов
/ 06 июля 2018

Как сказали другие авторы, нам понадобятся минимальные данные выборки и условия выборки, чтобы рекомендовать решение.

Например, чтение "... несколько условий ... с 8,9 в конце ..." заставляет меня думать о LISTAGG, но я не могу сформулировать это как ответ, потому что я не имею ни малейшего понятия об условиях.

0 голосов
/ 06 июля 2018

Вы можете использовать CASE выражение:

UPDATE SNAPSHOT_TEST
SET ERROR_CODE = 
    CASE  WHEN ... THEN NVL2(ERROR_CODE, CONCAT(ERROR_CODE, ',8'), '9')
          WHEN ... THEN NVL2(ERROR_CODE, CONCAT(ERROR_CODE, ',9'), '9') 
          ELSE ...
    END;

с 8,9 в конце

UPDATE SNAPSHOT_TEST
SET ERROR_CODE =
  ERROR_CODE || CASE WHEN ... THEN '8' END || CASE WHEN ... THEN '9' END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...