Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 在pgsql中使用带有update子句的IF语句_Postgresql_Query Optimization - Fatal编程技术网

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应该执行所有操作。