考虑这个 CTE:
WITH division_by_zero AS (
SELECT 1/0
)
SELECT 42
它返回 42 而不是引发错误。如何强制 PostgreSQL 评估SELECT 1/0
?
考虑这个 CTE:
WITH division_by_zero AS (
SELECT 1/0
)
SELECT 42
它返回 42 而不是引发错误。如何强制 PostgreSQL 评估SELECT 1/0
?
这显然不起作用:
SELECT regexp_matches[1], regexp_matches[1]
FROM ROWS FROM (
regexp_matches('fooBarBaz', '[[:upper:]]', 'g'),
regexp_matches('fooBarBaz', '[[:lower:]]', 'g')
);
错误:[42702] 列引用“regexp_matches”不明确
如何为函数调用提供别名?
SELECT u[1], l[1]
FROM ROWS FROM (
regexp_matches('fooBarBaz', '[[:upper:]]', 'g'),
regexp_matches('fooBarBaz', '[[:lower:]]', 'g')
) AS (u text[], l text[]);
错误:[42601] 具有多个函数的 ROWS FROM() 不能有列定义列表
提示:在 ROWS FROM() 中为每个函数放置一个单独的列定义列表。
SELECT u[1], l[1]
FROM ROWS FROM (
regexp_matches('fooBarBaz', '[[:upper:]]', 'g') AS (u text[]),
regexp_matches('fooBarBaz', '[[:lower:]]', 'g') AS (l text[])
);
错误:[42601] 列定义列表只允许用于返回“记录”的函数
我没主意了。这必须是可能的。
文档:
这有效:
CREATE OR REPLACE FUNCTION sql_fun()
RETURNS TABLE (id UUID) AS $$
INSERT INTO foo DEFAULT VALUES
RETURNING id
$$ LANGUAGE SQL;
SELECT *
FROM sql_fun();
这不会:
CREATE OR REPLACE FUNCTION plpgsql_fun()
RETURNS TABLE (id UUID) AS $$
BEGIN
RETURN QUERY
INSERT INTO foo DEFAULT VALUES
RETURNING id;
END
$$ LANGUAGE PLpgSQL;
SELECT *
FROM plpgsql_fun();
这是 PL/pgSQL 中的错误吗?如何在保持返回类型不变的同时解决此问题?
我想做这样的事情:
SELECT *
FROM information_schema.tables
WHERE table_schema IN (search_path)
我在文档中找不到任何内容。可能吗?如何?