Considere este CTE:
WITH division_by_zero AS (
SELECT 1/0
)
SELECT 42
Ele retorna 42 em vez de gerar um erro. Como posso forçar o PostgreSQL a avaliar o SELECT 1/0
?
Considere este CTE:
WITH division_by_zero AS (
SELECT 1/0
)
SELECT 42
Ele retorna 42 em vez de gerar um erro. Como posso forçar o PostgreSQL a avaliar o SELECT 1/0
?
Isso obviamente não funciona:
SELECT regexp_matches[1], regexp_matches[1]
FROM ROWS FROM (
regexp_matches('fooBarBaz', '[[:upper:]]', 'g'),
regexp_matches('fooBarBaz', '[[:lower:]]', 'g')
);
Erro: [42702] referência de coluna "regexp_matches" é ambígua
Como posso dar um alias para as chamadas de função?
SELECT u[1], l[1]
FROM ROWS FROM (
regexp_matches('fooBarBaz', '[[:upper:]]', 'g'),
regexp_matches('fooBarBaz', '[[:lower:]]', 'g')
) AS (u text[], l text[]);
Erro: [42601] ROWS FROM() com várias funções não pode ter uma lista de definição de coluna
Dica: Coloque uma lista de definição de coluna separada para cada função dentro de 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[])
);
Erro: [42601] uma lista de definição de coluna só é permitida para funções que retornam "registro"
Estou sem ideias. Isso tem que ser possível.
Documentação:
Isso funciona:
CREATE OR REPLACE FUNCTION sql_fun()
RETURNS TABLE (id UUID) AS $$
INSERT INTO foo DEFAULT VALUES
RETURNING id
$$ LANGUAGE SQL;
SELECT *
FROM sql_fun();
Isso não:
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();
Isso é um bug no PL/pgSQL? Como posso corrigir isso mantendo o tipo de retorno como está?
Eu gostaria de fazer algo assim:
SELECT *
FROM information_schema.tables
WHERE table_schema IN (search_path)
Não encontrei nada nos documentos. É possível? Como?