#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()
в нем не будет.