2016-06-10 1 views
0

Я хочу добавить условие в обновление. Я действительно не уверен, как это сделать. я хочу сделать следующее:с использованием оператора IF с предложением update в pgsql

UPDATE 
    xyz_table 
SET 
    cap = some_text, IF (some_text IS NULL) THEN some_text = alternate_text ENDIF 
WHERE 
    alternate_text <> '' AND 
    cap IS NULL AND 
    some_relation_id IN (50, 51, 52 ); 

Если есть действительно какой-либо способ сделать это, пожалуйста, предложите еще я думаю, что нужно будет выполнить тот же запрос дважды, чтобы достичь этого. Спасибо заранее:

ответ

2

Вы можете использовать case или coalesce(). Это set заявление:

SET cap = some_text, 
    some_text = COALESCE(some_text, alternate_text) 
+0

Как насчет производительности? что работает быстрее? –

+1

в вашем случае я думаю, что такое же исполнение - 'coalesce' будет более результативным с большим количеством аргументов, которые я считаю. Поскольку это должно прекратить аргументы оценки после первого не нулевого значения, в то время как случай должен делать все это. –

0

, что нужно сделать:

UPDATE 
    xyz_table 
SET 
    cap = some_text, some_text = (case when some_text IS NULL THEN alternate_text else some_text end) 
WHERE 
    alternate_text <> '' AND 
    cap IS NULL AND 
    some_relation_id IN (50, 51, 52 ); 

не забудьте BEGIN операции перед запуском

+0

скобки логичны (необязательно) - нет необходимости в машине, только для глаз человека –

+0

ах и делать это в транзакции конечно :) - Мне негде было попробовать –

+0

'coalesce' более изящный (и я думаю лучше) путь. Я просто «перевел» ваш 'IF' в работу' CASE WHEN' –

0

В вашем конкретном примере, самый простой способ будет использовать IsNull().

UPDATE 
xyz_table 
SET cap = ISNULL(some_text, alternate_text) 
WHERE alternate_text <> '' AND 
cap IS NULL AND 
some_relation_id IN (50, 51, 52 ); 

для других условий, я склонен использовать деловую форму.

UPDATE 
xyz_table 
SET cap = CASE WHEN some_text = '' THEN alternate_text ELSE some_text END 
WHERE alternate_text <> '' AND 
cap IS NULL AND 
some_relation_id IN (50, 51, 52 ); 
Смежные вопросы