【问题标题】:How can I use WITH together with IF in PL/pgSQL function如何在 PL/pgSQL 函数中使用 WITH 和 IF
【发布时间】:2021-01-08 23:24:53
【问题描述】:
CREATE OR REPLACE FUNCTION test()
RETURNS boolean security definer AS
$BODY$

BEGIN

with zzz as (select foo from data)

 IF EXISTS (select 1 from zzz) THEN
 
  return true;
  
  ELSE
     return false;
  END IF;

END;
$BODY$
LANGUAGE plpgsql VOLATILE;
ERROR:  syntax error at or near "IF"
LINE 10:  IF EXISTS (select 1 from zzz) THEN

问题出在哪里?

【问题讨论】:

  • 您将SQL (WITH) 与plpgsql(IF) 混合在一起。丢失WITH 语句并使用PERFORM foo from data,然后根据Perform 使用IF FOUND ...

标签: sql postgresql plpgsql exists


【解决方案1】:

简化为单个返回语句:

return exists(select foo from data);

【讨论】:

    【解决方案2】:

    像 Bohemian 提供的一样,您可以从根本上简化为:

    RETURN EXISTS(SELECT foo FROM data);
    

    但是,这表明foo 很重要,但它并不重要(如果该列存在,则引发异常)。 EXISTS 返回 true 如果至少返回一行,无论内容如何:甚至可以是所有 NULL 值。否则返回false。从不null。少误导:

    RETURN EXISTS(SELECT * FROM data);
    RETURN EXISTS(SELECT 1 FROM data);
    

    Postgres 也接受一个空的SELECT 列表(我的偏好):

    RETURN EXISTS(SELECT FROM data);
    

    见:

    或者对于简单的情况使用语法简写TABLE

    RETURN EXISTS(TABLE data);
    

    见:

    PL/pgSQL 对于简单的情况来说是多余的,一个普通的 SQL 函数或者只是简单的语句就可以了:

    SELECT EXISTS(TABLE data);
    

    为了将逻辑集成到更复杂的 PL/pgSQL 函数中,特殊变量 FOUND(如 Adrian commented)通常很有帮助。或者 GET DIAGNOSTICS ... 用于动态 SQL。

    见:

    【讨论】:

      【解决方案3】:

      最后我用了:

      $BODY$
      
      BEGIN
      
      DROP TABLE IF EXISTS mytable;
      CREATE TEMP TABLE mytable AS
      
      SELECT foo from data;
      
       IF EXISTS (select 1 from mytable) THEN
       
        return true;
        
        ELSE
           return false;
        END IF;
      
      
      END;
      $BODY$
      

      【讨论】:

      • 为什么是临时表?那没有意义。波西米亚人的回答更有效率
      猜你喜欢
      • 2016-07-07
      • 1970-01-01
      • 1970-01-01
      • 2017-05-13
      • 1970-01-01
      • 1970-01-01
      • 2017-02-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多