Tentei criar um imutável CONCAT()
. Para isso, tentei usar as seguintes consultas SQL.
Opção 1
CREATE FUNCTION immutable_concat(VARIADIC text[])
RETURNS text
LANGUAGE internal IMMUTABLE PARALLEL SAFE AS 'text_concat';
Opção 2
CREATE FUNCTION immutable_concat(VARIADIC text[])
RETURNS text
LANGUAGE sql IMMUTABLE PARALLEL SAFE
RETURN array_to_string($1, '');
Como resultado, obtenho uma função que funciona bem com texto. Mas como posso criar uma função similar que pegue um array contendo não apenas elementos de texto?
CONCAT()
nos permite executar a seguinte consulta SQL:
SELECT concat(CURRENT_DATE, true, false, 1, 'text');
Como resultado, obteremos a seguinte string:
2025-03-07tf1text
Idealmente, eu gostaria de criar uma função que pudesse receber diferentes elementos. Quero dizer o seguinte:
SELECT immutable_concat(CURRENT_DATE, true, false, 1, 'text');
A maneira
concat()
de fazer isso é aceitandovariadic any
que nem funçõessql
nemplpgsql
funções de linguagem são permitidas. Contanto que os tipos de elementos correspondam e você cite o corpo da função, você pode usar um polimórficoanyarray
:demo em db<>fiddle
Você também pode reclassificar o interno
concat()
:Meu palpite é que você está tentando usar isso para uma expressão gerada ou um índice funcional e, se for o caso, presumo que você saiba o risco .