Перемещение данных из одной таблицы в другую аналогичную таблицу

#java #sql #servlets #db2

#java #sql #сервлеты #db2

Вопрос:

Обычно я стараюсь избегать использования курсоров и перебора результирующего набора, но как я могу выполнить это в следующем сценарии без перебора SomeTable и вставки строк одну за другой в MyTable ?

Простая схема выглядит следующим образом:

 MyTable
- Name  VARCHAR(20)
- Code1 CHAR(5)
- Code2 CHAR(5)

SomeTable
- Name      VARCHAR(20)
- SomeCode1 CHAR(10)
- SomeCode2 CHAR(10)
  

Инструкция SQL:

 INSERT INTO MyTable (Name, Code1, Code2)
SELECT Name, First Five Chars of SomeCode1 Only if SomeCode2 is not null or empty or doesn't have a certain value, SomeCode2
FROM SomeTable
  

Я делаю это внутри Java-кода, но я не уверен, возможно ли это сделать в одной INSERT INTO SELECT инструкции целиком. Я почти близок к написанию цикла for с одиночными INSERT операторами в них. Должен ли я создать какую-то функцию в базе данных или .. ? Я использую DB2.

Ответ №1:

 INSERT INTO MyTable (Name, Code1, Code2)
SELECT Name, 
  CASE When coalesce(SomeCode2, '')='' Then NULL
       When SomeCode2=@somevalue Then NULL
       Else substring(SomeCode1, 1, 5)
, SomeCode2
FROM SomeTable
  

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

1. Разве это не должно быть SUBSTR () вместо SUBSTRING() ?

Ответ №2:

 insert into MyTable (Name, Code1, Code2)
select Name, case when (SomeCode2 is not null and length(trim(SomeCode2)) <> 0) then substr(SomeCode1, 0, 5) end, SomeCode2 from SomeTable;
  

Ответ №3:

Если вам нужны записи null, когда они не найдены:

 insert into MyTable (Name, Code1, Code2)
select
  Name,
  if(not isnull(SomeCode2) and SomeCode2 != ''
     and SomeCode2 != 'foo', substring(SomeCode1,1,5), null),
  SomeCode2
  from SomeTable
;
  

-или-

Если вы не хотите, чтобы какая-либо строка существовала, когда записи не найдены:

 insert into MyTable (Name, Code1, Code2)
select
  Name,
  substring(SomeCode1, 1, 5),
  SomeCode2
  from SomeTable
  where not isnull(SomeCode2) and SomeCode2 != '' and SomeCode2 != 'foo'
;