@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?
  • Вопрос задан
  • 338 просмотров
Решения вопроса 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
Можно оба поля обновлять по разным условиям на искомое значение или на себя.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы