Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.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条件语句_Sql_Postgresql_If Statement - Fatal编程技术网

PostgreSQL条件语句

PostgreSQL条件语句,sql,postgresql,if-statement,Sql,Postgresql,If Statement,我需要基于结果实现一个条件SELECT语句 另一种说法。我不想为此创建函数,只想使用条件选择 我失败的方法如下所示: DO $do$ BEGIN IF SELECT count(*) FROM table1 < 1 THEN SELECT * FROM table2; RETURN QUERY; ELSE SELECT * FROM table3; RETURN QUERY; END IF; END $do$ 我可以通过在PHP中检查查询结果来实现相同的结果

我需要基于结果实现一个条件SELECT语句 另一种说法。我不想为此创建函数,只想使用条件选择

我失败的方法如下所示:

DO
$do$
BEGIN
IF SELECT count(*) FROM table1 < 1 THEN
   SELECT * FROM table2;
   RETURN QUERY;

ELSE 
   SELECT * FROM table3;
   RETURN QUERY;
END IF;
END
$do$
我可以通过在PHP中检查查询结果来实现相同的结果 基于此,执行另一个查询,但我想知道是否可以仅在PostgreSQL中执行此操作。

尝试以下操作:

with c as (select count(*) cnt from table1)
select table2.* from table2, c where c.cnt < 1
union all
select table3.* from table3, c where c.cnt >= 1

如果表2和表3是union兼容的,则可以使用单个SELECT:

SELECT * FROM table2 WHERE NOT EXISTS(SELECT * FROM table1)
UNION
SELECT * FROM table3 WHERE EXISTS(SELECT * FROM table1);

@NickBarnes我编辑了这篇文章:第一个查询必须计算结果,根据这个结果,另一个查询必须返回结果。在我的特殊情况下,所有查询都相当长,所以我决定用更简单的等价物替换它们。如果询问列,所有3个查询都将具有相同的列返回查询是一条语句。它应该是返回查询选择…-但是PL/pgSQL块不能返回任何内容,所以不能在其中使用返回查询anyway@a_horse_with_no_name好的,有没有可能让PL/pgSQL返回一个查询?您可以让PL/pgSQL函数返回一些东西,但不是匿名块。在一般情况下,如果您想知道查询是否不存在,最好是不存在,而不是计数*<1Yes。如果条件仅与存在有关,如问题中的“then EXISTS”(即存在),则肯定更可取。@如果要多次使用SELECT,则最好使用acesargl with,也可以在答案中使用with;。使用count强制对所有元组进行计数,使用NOT EXISTS在找到一个元组时中止内部选择EXISTS和NOT EXISTS通常使用短路或麦卡锡求值。作为性能问题,请使用UNION all而不是UNION;。我还建议您使用从表1中选择1,而不是从表1中选择*;。存在和不存在忽略嵌套选择中的投影列表。因此,在本例中,select*和select 1是等效的。