@illaaa

Можно ли написать sql-запрос, который при выполнении разных условий будет записывать данные в разные поля?

Можно ли написать sql-запрос, который при выполнении разных условий будет записывать данные в разные поля?
Например:
case 
when t1.abc = 'A' then insert t1.abc into t1 (letter) -- если один результат - вставить в одно поле
when t1.abc = '1' then insert t1.abc into t1 (num) -- если другой результат - вставить в другое поле
end

Подскажите, возможно ли это реализовать на sql?
  • Вопрос задан
  • 434 просмотра
Решения вопроса 1
Сначала стоит сформировать запрос, который возвращает данные разного типа в разных столбцах, и уже его результаты инсертить.

insert into tb
select case when cond1 then 1 else null num,
       case when not cond1 then 'a' else null str
from ...


Вот пример более развёрнуто:
create table test_a(num number, str varchar2(100));

insert into test_a
with
  generator as
   (select case
             when dbms_random.value() > 0.5 then dbms_random.string('p', 10)
             else to_char(trunc(dbms_random.value(0, 100)))
           end str
      from dual
      connect by level <= 50),
  classificator as
   (select str, case
                  when translate(str, chr(10)||'0123456789', chr(10)) is null then 'number'
                  else 'string'
                end type
      from generator)
select case
         when type = 'number' then to_number(str)
         else null
       end num,
       case
         when type = 'string' then str
         else null
       end str
  from classificator;
commit;

select * from test_a;
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@d-stream
Готовые решения - не подаю, но...
Классика:

update table
set 
filed_n = case when условие1 then значение/выражение else field_n end
filed_m = case when условие2 then значение/выражение else field_m end
where ….


С insert - собственно аналогично, только в case негативная ветка будет содержать null
Ответ написан
Комментировать
duhbox
@duhbox
Правда Oracle, но думаю должен быть аналогичный подход.
Вот кусок из моего merge:
WHEN MATCHED THEN
UPDATE
SET DATE_E = CASE WHEN (DATE_B = MERGE_SUBQUERY.DATE_B$1)
THEN MERGE_SUBQUERY.DATE_E$1
ELSE DATE_E
END
Можно оба поля обновлять по разным условиям на искомое значение или на себя.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы