#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'
;