Я хотел бы сделать оператор "обновить строку" или "вставить, если не существует" в таблицу базы данных H2 с функцией MERGE INTO.
Табель выглядит так:
CREATE TABLE TARGET_TABLE
( cola VARCHAR(10),
colb VARCHAR(10),
colc VARCHAR(10),
col1 INT,
colz VARCHAR(10)
);
ключевые поля для слияния: 'cola' и 'colb'.
Я попробовал следующее:
MERGE INTO TARGET_TABLE USING DUAL
ON cola = 'a' AND colb = 'b'
WHEN NOT MATCHED THEN
INSERT VALUES ('a', 'b', 'cc', 1, 'zz')
WHEN MATCHED THEN UPDATE SET colc = 'cc', col1 = TARGET_TABLE.col1 + 1 --Aggregation
colz = CASEWHEN(TARGET_TABLE.colz IS NULL, 'zz', TARGET_TABLE.colz ); --check if it is null
Ошибка:
[42001] [42001] Синтаксическая ошибка в операторе SQL "MERGE INTO TARGET_TABLE USING [*] DUAL
Вторая попытка:
MERGE INTO TARGET_TABLE AS T
(SELECT 'a' cola, 'b' colb, 'cc' colc, 1 col1, 'zz' colz FROM DUAL) as D
ON (T.cola = D.cola AND
T.colb = D.colb
)
WHEN MATCHED THEN UPDATE
T.colc = D.colc,
T.col1 = T.col1 + D.col1
T.colz = CASEWHEN(T.colz IS NULL, D.colz, T.colz );
WHEN NOT MATCHED THEN
INSERT VALUES (D.cola, D.colb, D.colc, D.col1, D.colz);
Ошибка:
Синтаксическая ошибка в операторе SQL "MERGE INTO TARGET_TABLE AS T [*]
Третья попытка:
MERGE INTO TARGET_TABLE KEY(cola,colb) VALUES( 'a', 'b', 'cc', 1, 'zz')
WHEN MATCHED THEN UPDATE
colc = 'cc',
col1 = TARGET_TABLE.e + 1
colz = CASEWHEN(TARGET_TABLE.z IS NULL, 'zz', ARGET_TABLE.z );
WHEN NOT MATCHED THEN
INSERT VALUES ('a', 'b', 'cc', 1, 'zz');
ОШИБКА:
[42000] [42000] Синтаксическая ошибка в операторе SQL «MERGE INTO TARGET_TABLE KEY (cola, colb) VALUES ('a', 'b', 'cc', 1, 'zz') WHEN [*] MATCHED THEN";
Итак, я хотел бы получить следующий результат в таблице:
Если строка еще не существует:
['a', 'b', 'cc', 1, 'zz']
Если он уже существует, обновите некоторые поля
['a', 'b', 'cc', old_value+1, 'z']
или
['a', 'b', 'cc', old_value+1, 'zz']
в зависимости от значения colz было NULL или нет.