微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

IF NOT EXISTS 在 RETURN QUERY 语句中

如何解决IF NOT EXISTS 在 RETURN QUERY 语句中

我有一个 Postgresql 函数,它接收一个字符串列表,在 Word 表中匹配这些字符串并相应地返回它们。 Word一个表,由字符串 word 作为主要 ID 和该字符串的属性组成。

这是该函数的工作版本。

CREATE OR REPLACE FUNCTION equals_words(words Text[]) RETURNS SetoF "Word" AS $BODY$
DECLARE
  w Text;
BEGIN
  FOREACH w IN ARRAY $1
  LOOP
    RETURN QUERY SELECT * FROM "Word" WHERE word = w
  END LOOP;
  RETURN;
END; $BODY$ LANGUAGE plpgsql STABLE STRICT;

我希望循环中的语句检查查询是否没有返回任何内容,如果是,则调用一个函数 longest_prefix(w TEXT) 尝试将 w 与其最长前缀匹配。这是我目前所拥有的。

CREATE OR REPLACE FUNCTION equals_words(words Text[]) RETURNS SetoF "Word" AS $BODY$
DECLARE
  w Text;
BEGIN
  FOREACH w IN ARRAY $1
  LOOP
    RETURN QUERY 
        IF NOT EXISTS(SELECT * FROM "Word" WHERE word = w)
        BEGIN
        SELECT * FROM longest_prefix(w); 
        END
  END LOOP;
  RETURN;
END; $BODY$ LANGUAGE plpgsql STABLE STRICT;

这不起作用,给我以下错误

ERROR:  Syntax error at or near "IF"
LINE 8:   IF NOT EXISTS(SELECT * FROM "Word" WHERE word = w)

我怀疑 NOT EXISTS 不能在 RETURN QUERY 语句中使用,但我不太确定。如果是这样,有人可以提出替代方案吗?

解决方法

您可以使用 CTE 和 UNION ALL 将所有这些都放在一个查询中:

WITH cte AS (
      SELECT *
      FROM "Word" w
      WHERE w.word = w
     )
SELECT cte.*
FROM cte
UNION ALL
SELECT *
FROM longest_prefix(w)
WHERE NOT EXISTS (SELECT 1 FROM cte);
,

IF 语句在 SQL 中是不允许的。但是您当然可以在 PL/pgSQL 中使用 IF 在不同的分支中执行不同的查询。

...
IF NOT EXISTS (SELECT * FROM "Word" WHERE word = w) THEN
  RETURN QUERY SELECT * FROM longest_prefix(w);
ELSE
  RETURN QUERY SELECT * FROM "Word" WHERE word = w;
END IF;
...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?