Я хотел бы объединить вставку / обновление с оператором case, что означает, что я хочу вставить строку, если она не существует, обновить ее, если она существует, но в обоих случаях с разными значениями (при обновлении это зависит от идентификатора ) и при вставке, ну тогда я его установил ...
И это должно произойти в одном выражении SQL: -)
В двух словах: я пытаюсь объединить эти два утверждения в одно:
1). Вставка / Обновление:
MERGE INTO table_name USING dual ON (id='{id}')
WHEN MATCHED THEN UPDATE SET {col1}='{val1}', {col2}={val2}
WHEN NOT MATCHED THEN INSERT ({id}, {col1}, {col2}) VALUES ('{id}', '{val1}', {val2})
2). Обновить разные значения с помощью регистра:
UPDATE SIGNALVALUE
SET
SIGNUMVALUE = CASE SIGID
WHEN 49634 THEN 1.1
WHEN 49674 THEN 2.2
WHEN 49675 THEN 1.8
END,
UPDATETIME = CASE SIGID
WHEN 49634 THEN TO_TIMESTAMP_TZ('2011-03-18 18:24:56:00', 'YYYY-MM-DD HH24:MI:SS:FF6 TZR')
WHEN 49674 THEN TO_TIMESTAMP_TZ('2011-03-18 18:24:56:00', 'YYYY-MM-DD HH24:MI:SS:FF6 TZR')
WHEN 49675 THEN TO_TIMESTAMP_TZ('2011-03-18 18:24:56:00', 'YYYY-MM-DD HH24:MI:SS:FF6 TZR')
END
WHERE SIGID IN (49634, 49674, 49675)
Эти заявления являются лишь примерами. На самом деле есть еще много строк для вставки / обновления, и это происходит часто, поэтому я пытаюсь минимизировать количество запросов.
Также я не могу выполнить обновление, а затем посмотреть, сколько строк было затронуто, а затем вставить те, которые не были исправлены, потому что я не буду знать идентификаторы строк, которые нужно вставить, по сравнению с теми, которые должны быть обновлены. По крайней мере, насколько я понимаю ... поправьте меня!