2016-06-10 33 views
0

我想在更新中添加一个条件我真的不知道该怎么做。 我想要做如下:使用IF语句与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

您可以使用casecoalesce()。这是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 ); 

对于其他条件,我倾向于使用case语句。

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 );