PostgreSQL 9.5 IF-THEN-ELSE 里面的 FUNCTION 不可用?

标签 postgresql

我的问题

尝试在我的 PostgreSQL 数据库 9.5CREATE FUNCTION 时,出现以下错误:

ERROR:  syntax error at or near "IF"
LINE 3:   IF strpos(trem_outcome, 'VALIDATED') = 0 THEN

这是我正在谈论的 FUNCTION:

CREATE OR REPLACE FUNCTION countValid(outcome text) RETURNS integer AS $$
    BEGIN
        IF strpos(outcome, 'VALIDATED') = 0 THEN
            RETURN 1;
        END IF;
        RETURN 0;
    END
$$ LANGUAGE SQL

看起来 IF-THEN-ELSE 控制语句在这里对我不可用,尽管我在 FUNCTION 中,对吗?

我错过了什么?

一些上下文

我最终想要对大量数据进行sum(countValid()),如下所示:

SELECT
    table1.tbl1_pk,
    count(table2.tbl2_outcome) as registered,
    sum(countValid(table2.tbl2_outcome)) as validated
FROM table1 JOIN table2 ON table2.tbl2_tbl1_fk = table1.tbl1_pk
GROUP BY table1.tbl1_pk;

我的 table 是这样的:

+---------------------------------------+
|                 table1                |
+---------------+-----------------------+
| tbl1_pk (int) | tbl1_other_crap (w/e) |
+---------------+-----------------------+
| 1             | ...                   |
| 2             | ...                   |
| 3             | ...                   |
+---------------+-----------------------+

+------------------------------------------------+
|                    table2                      |
+---------+-----------------------+--------------+
| tbl2_pk | tbl2_tbl1_fk          | tbl2_outcome |
| (int)   | (int -> tbl1.tbl1_pk) | (text)       |
+---------+-----------------------+--------------+
| 1       | 1                     | VALIDATED    |
| 2       | 1                     | FLUNKED      |
| 3       | 3                     | VALIDATED    |
| 4       | 3                     | VALIDATED    |
| 5       | 1                     | FLUNKED      |
| 6       | 2                     | VALIDATED    |
| 7       | 3                     | VALIDATED    |
+---------+-----------------------+--------------+

我希望得到以下结果集:

+---------------+------------------+-----------------+
| tbl1_pk (int) | registered (int) | validated (int) |
+---------------+------------------+-----------------+
| 1             | 3                | 1               |
| 2             | 1                | 1               |
| 3             | 3                | 3               |
+---------------+------------------+-----------------+

最小可重现示例

我可以用更简单的函数重现我的问题:

CREATE OR REPLACE FUNCTION countValid(outcome text) RETURNS integer AS $$
    BEGIN
        IF 1 = 1 THEN
            RETURN 1;
        END IF;
        RETURN 0;
    END
$$ LANGUAGE SQL

...触发:

ERROR:  syntax error at or near "IF"
LINE 3:   IF 1 = 1 THEN

我对完全不同的方法持开放态度,尽管我更愿意在单个查询中执行我的工作。

最佳答案

您不需要该功能。只需使用

count(table2.tbl2_outcome = 'VALIDATED' or null)

关于PostgreSQL 9.5 IF-THEN-ELSE 里面的 FUNCTION 不可用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35671728/

相关文章:

postgresql - 如何在 PostgreSQL 中调试触发器递归?

ruby-on-rails - 如何调试卡在数据库事务中的 ruby​​ 进程?

postgresql - 允许任何用户以完全权限连接到 postgres 吗?

postgresql - 无法从外部机器连接到 Postgres(通过 Kubernetes Helm 安装)服务,连接被拒绝

sql - 总结最近的行,按 id 分组

PostgreSQL - 选择多个最大计数

python - 使用 psycopg2 将数据从 Postgresql 提取到 python 的最快/最有效的方法是什么

c# - 使用回滚的 Postgres、Npgsql 和集成测试

ruby-on-rails - PGconn.open 上的 Heroku 错误(:dbname => 'EBDX' ) Works fine on local, 但在 Heroku 上部署后没有

php - 多个表单和多个提交,一个提交按钮