Postgresql 在pgsql中使用带有update子句的IF语句
我想在更新中添加一个条件,但我真的不知道该怎么做。 我想做以下几点:Postgresql 在pgsql中使用带有update子句的IF语句,postgresql,query-optimization,Postgresql,Query Optimization,我想在更新中添加一个条件,但我真的不知道该怎么做。 我想做以下几点: 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 ); 更新
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 );
更新
xyz_表
设置
cap=某些文本,如果(某些文本为空),则某些文本=备用文本ENDIF
哪里
替换文本“”和
cap为空且
(50,51,52)中的一些关系;
如果真的有任何方法可以做到这一点,请建议我需要执行两次相同的查询来实现这一点。
提前感谢:)您可以使用
case
或coalesce()
。这是set
语句:
SET cap = some_text,
some_text = COALESCE(some_text, alternate_text)
您可以使用
case
或coalesce()
。这是set
语句:
SET cap = some_text,
some_text = COALESCE(some_text, alternate_text)
这应该做到:
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 );
更新
xyz_表
设置
cap=一些文本,一些文本=(当一些文本为空时,则替换其他文本,另一些文本结束)
哪里
替换文本“”和
cap为空且
(50,51,52)中的一些关系;
在运行之前,不要忘了开始
事务,这应该做到:
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 );
更新
xyz_表
设置
cap=一些文本,一些文本=(当一些文本为空时,则替换其他文本,另一些文本结束)
哪里
替换文本“”和
cap为空且
(50,51,52)中的一些关系;
在运行之前,不要忘了
开始
事务在您的特定示例中,最简单的方法是使用IsNull()
更新
xyz_表
SET cap=ISNULL(某些文本、备用文本)
其中,替换_文本“”和
cap为空且
(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 );
更新
xyz_表
设置cap=CASE,当某些\u text=''时,然后替换\u text,其他一些\u text结束
其中,替换_文本“”和
cap为空且
(50,51,52)中的一些关系;
在您的特定示例中,最简单的方法是使用IsNull()
更新
xyz_表
SET cap=ISNULL(某些文本、备用文本)
其中,替换_文本“”和
cap为空且
(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 );
更新
xyz_表
设置cap=CASE,当某些\u text=''时,然后替换\u text,其他一些\u text结束
其中,替换_文本“”和
cap为空且
(50,51,52)中的一些关系;
括号是合乎逻辑的(可选)-不需要机器,只需要人的眼睛啊,当然是在交易中做的:)-我没有地方尝试它合并
是更优雅(我认为更好)的方式。我只是把你的<代码>如果<代码>转换为工作<代码>的情况,当<代码>括号是逻辑的(可选)-不需要机器,只需要人的眼睛,当然,在交易中这样做:)-我没有地方尝试它<代码>合并<代码>更优雅(我认为更好)的方式。我只是把你的IF
翻译成了工作CASE WHEN
在你的情况下,我认为相同的性能-合并
会更有效,我相信有更多的参数。因为它应该在第一个NOTNULL值之后停止对参数求值,而case应该完成所有这些操作。在您的情况下,我认为相同的性能-coalesce
将在参数越多的情况下更有效。因为它应该在第一个NOTNULL值之后停止对参数求值,而case应该执行所有操作。