2 回答

TA贡献1827条经验 获得超9个赞
您可以使用:
SELECT (ST_IsValidDetail(the_value)).* FROM the_table;
...但是不幸的是,PostgreSQL实际上ST_IsValidDetail每行执行一次该功能。作为一种解决方法,您可以稍微处理一下查询,通过公用表表达式实现,然后在第二遍中提取元组:
WITH interim_result(v) AS (
SELECT ST_IsValidDetail(the_value) FROM the_table
)
SELECT (v).* FROM interim_result;
需要用括号括起来(v),以告诉解析器您所指的是一个值,而不是表名。
演示:
CREATE OR REPLACE FUNCTION multirows(x IN integer, a OUT integer, b OUT integer, c OUT integer) AS
$$
BEGIN
RAISE NOTICE 'multirows(%) invoked', x;
a := x;
b := x+1;
c := x+2;
RETURN;
END;
$$ LANGUAGE plpgsql;
craig=> SELECT multirows(x) FROM generate_series(1,2) x;
NOTICE: multirows(1) invoked
NOTICE: multirows(2) invoked
multirows
-----------
(1,2,3)
(2,3,4)
(2 rows)
craig=> SELECT (multirows(x)).* FROM generate_series(1,2) x;
NOTICE: multirows(1) invoked
NOTICE: multirows(1) invoked
NOTICE: multirows(1) invoked
NOTICE: multirows(2) invoked
NOTICE: multirows(2) invoked
NOTICE: multirows(2) invoked
a | b | c
---+---+---
1 | 2 | 3
2 | 3 | 4
(2 rows)
craig=> WITH interim(v) AS (SELECT multirows(x) FROM generate_series(1,2) x)
SELECT (v).* FROM interim;
NOTICE: multirows(1) invoked
NOTICE: multirows(2) invoked
a | b | c
---+---+---
1 | 2 | 3
2 | 3 | 4
(2 rows)
添加回答
举报