PostgreSQL条件语句
我需要基于结果实现一个条件SELECT语句 另一种说法。我不想为此创建函数,只想使用条件选择 我失败的方法如下所示: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中检查查询结果来实现相同的结果
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是等效的。