Vla*_*nov 63 sql postgresql if-statement plpgsql
我如何在Postgres中进行此类查询?
IF (select count(*) from orders) > 0
THEN
  DELETE from orders
ELSE 
  INSERT INTO orders values (1,2,3);
Run Code Online (Sandbox Code Playgroud)
    Erw*_*ter 115
尝试:
DO
$do$
BEGIN
IF EXISTS (SELECT FROM orders) THEN
   DELETE FROM orders;
ELSE 
   INSERT INTO orders VALUES (1,2,3);
END IF;
END
$do$
Run Code Online (Sandbox Code Playgroud)
标准SQL中没有过程元素.该IF语句是默认过程语言PL/pgSQL的一部分.您需要使用该DO命令创建函数或执行ad-hoc语句.
;在plpgsql中的每个语句的末尾都需要一个(最后的除外END).
你需要END IF;在IF声明的最后.
子选择需要用括号括起来:
IF (SELECT count(*) FROM orders) > 0 ...
Run Code Online (Sandbox Code Playgroud)
要么:
IF (SELECT count(*) > 0 FROM orders) ...
Run Code Online (Sandbox Code Playgroud)
但这相当且快得多:
IF EXISTS (SELECT FROM orders) ...
Run Code Online (Sandbox Code Playgroud)SELECT在这里你根本不需要额外的.这样做也快一点:
DO
$do$
BEGIN
DELETE FROM orders;
IF NOT FOUND THEN
   INSERT INTO orders VALUES (1,2,3);
END IF;
END
$do$
Run Code Online (Sandbox Code Playgroud)
        Mah*_*ood 26
只是为了帮助,如果有人偶然发现像我这样的问题,如果你想在PostgreSQL中使用if,你使用"CASE"
select 
    case
        when stage = 1 then 'running'
        when stage = 2 then 'done'
        when stage = 3 then 'stopped'
    else 
        'not running'
    end as run_status from processes
Run Code Online (Sandbox Code Playgroud)
        来自文档
IF boolean-expression THEN
    statements
ELSE
    statements
END IF;
Run Code Online (Sandbox Code Playgroud)
因此,在上面的示例中,代码应如下所示:
IF select count(*) from orders > 0
THEN
  DELETE from orders
ELSE 
  INSERT INTO orders values (1,2,3);
END IF;
Run Code Online (Sandbox Code Playgroud)
你错过了:END IF;
您还可以将PL / pgSQL CASE的基本结构与匿名代码块过程块一起使用:
DO $$ BEGIN
    CASE
        WHEN boolean-expression THEN
          statements;
        WHEN boolean-expression THEN
          statements;
        ...
        ELSE
          statements;
    END CASE;
END $$;
Run Code Online (Sandbox Code Playgroud)
参考文献: