Как изменить значения 2 столбцов с помощью оператора case в oracle sql

#sql #oracle #case

#sql #Oracle #case

Вопрос:

Я хочу узнать, как я могу изменить значения в 2 столбцах на основе оператора case when.

Пример данных таблицы приведен ниже (текущие данные содержат около 60 столбцов, которые я ввел, но только этот столбец:

 QUEUE | NOTES
12345 | Lorem 
12345 | ipsum
45678 | dolor
78901 | sit
90123 | amet
  

Теперь я написал следующий запрос, который дает мне первую часть:

 SELECT
  CASE
    WHEN SUBSTR (QUEUE, 1, 2) = '12'
  THEN 'Abandoned'
  ELSE QUEUE
  END AS QUEUE,
  NOTES
FROM
  TABLE_1
;
  

Второй шаг, который мне нужно предпринять, основан на первом операторе case. Если в поле queue очередь оставлена, мне нужно заменить поле примечания текстом с надписью «Очередь, измененная пользователем 29.09.16», но я не уверен, как я это делаю.

Я предполагаю, что мог бы написать это в дополнительном запросе выбора, но опять же я не знаю, как я ориентируюсь, если значение одного столбца равно чему-то, а затем замените значения других столбцов. Также хотелось бы знать, возможно ли записать все это в одном операторе case…

Если кто-нибудь может посоветовать.

Спасибо

Комментарии:

1. Выражение Case, а не оператор case. (Он возвращает значение.)

Ответ №1:

Также используйте выражение CASE для столбца Note

 SELECT
  CASE
     WHEN SUBSTR (QUEUE, 1, 2) = '12'
     THEN 'Abandoned'
     ELSE QUEUE
  END AS QUEUE,
  CASE
     WHEN SUBSTR (QUEUE, 1, 2) = '12'
     THEN 'Queue Amended by User AN 29.09.16'
     ELSE NOTES
  END  AS Notes
FROM
TABLE_1
  

Комментарии:

1. Спасибо Jaydip, просто чтобы уточнить, будет ли это перезаписывать существующую заметку в поле notes с помощью «Queue, измененной пользователем 29.09.16», или он добавит еще один столбец с полем Notes?

2. Когда очередь заброшена, только тогда она заменяет Note заданной строкой, и она будет давать Notes независимо от содержимого в нем в том же столбце

Ответ №2:

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

 SELECT
  (CASE
    WHEN SUBSTR (QUEUE, 1, 2) = '12'
  THEN 'Abandoned'
  ELSE QUEUE
  END) AS QUEUE,

  (CASE
    WHEN SUBSTR (QUEUE, 1, 2) = '12'
  THEN 'Queue Amended by User ' ||user ||' '|| to_char(sysdate, 'DD.MM.RRRR')
  ELSE NOTES
  END) AS NOTES
FROM table_1
  

Комментарии:

1. Спасибо, ребята, я думаю, мне придется пойти по пути обновления таблицы, поскольку мне нужно будет убедиться, что если кто-то еще использует таблицу, то эта информация будет легко доступна. Также я попробовал запрос Jaydip, который будет работать нормально, но поскольку у меня уже есть поле notes, так как у меня есть select *, то столбец отображается неоднозначно определенным (как исходное поле notes), поэтому для его работы пришлось бы вводить в каждой строке имени столбца исходные заметки…

Ответ №3:

Если у вас есть таблица, вызываемая table_1 со столбцами queue и notes текущими значениями в вашем примере ввода, и вы должны ОБНОВИТЬ таблицу, как вы описали, это просто (и вам не нужно одно или два выражения «case», все, что вам нужно, это фильтр WHERE):

 update table_1
   set queue = 'Abandoned',
       notes = 'Queue Amended by User AN 09.29.16'
where  queue like '12%'
;
  

(Или значение для ЗАМЕТОК может быть объединено с переменными для пользователя и / или даты, как показал Э. Нинис в своем решении.) Обратите внимание, что условие «like» позволит Oracle использовать индекс, который может быть у вас в queue столбце; использование substr() в нем не будет.