我的问题
尝试在我的 PostgreSQL 数据库 9.5 中CREATE
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/