Supondo que eu tenha a seguinte função:
CREATE OR REPLACE FUNCTION myfun(IN TEXT)
RETURNS boolean
LANGUAGE SQL
IMMUTABLE
LEAKPROOF
AS $CODE$
SELECT COALESCE(
$1 ILIKE ANY (ARRAY[
'test',
'bar'
]),
false
);
$CODE$;
Que retorna true
se $1
corresponder 'test'
ou 'bar'
.
Como posso usar essa função em outra ANY
consulta? Por exemplo:
SELECT myfun ANY(ARRAY['hello', 'world']); -- should return false
SELECT myfun ANY(ARRAY['hello', 'foo']); -- should return true ('foo' matches)
SELECT myfun ANY(ARRAY['test', 'world']); -- should return true ('test matches')
Mas esta sintaxe está incorreta. E eu não sei muito bem como escrever isso corretamente.
editar: mais detalhes
Em essência, o que eu quero fazer é verificar se qualquer um de um conjunto de colunas contém qualquer um dos termos proibidos. Em outras palavras, tenho um conjunto de termos proibidos e preciso verificar várias colunas para conter essa palavra. Isso será usado posteriormente em uma política RLS. No exemplo abaixo, a função contains_forbidden_term
é a função que eu gostaria de poder escrever.
Uma pequena, mas importante observação: As mesmas funções devem ser aplicadas a outras tabelas, mas com número variável de argumentos (daí o array como tipo de argumento).
CREATE TABLE foo (
name TEXT,
last_name TEXT
);
CREATE USER bob;
ALTER TABLE foo ENABLE ROW LEVEL SECURITY;
CREATE POLICY bob_foo ON foo TO bob USING (contains_forbidden_term(ARRAY[name, last_name]));
GRANT SELECT ON foo TO bob;
Você pode usar a primeira função com,
ANY
mas precisa ter uma sintaxe válida como descobriu (<expression> <**operator**> ANY ...
). Portanto, o seguinte funcionaria (o "truque" é usarunnest()
enquanto desdobra a matriz em linhas):ou o mais compacto:
A partir dos documentos, parece que a sintaxe para
ANY/ALL
consultas deve serContinuei meu trabalho nessa direção e cheguei ao seguinte que funciona:
Mas isso parece um pouco como uma maneira indireta de fazer algo simples e me pergunto se não fui pego em uma toca de coelho enquanto usava antolhos, não vendo uma solução mais fácil (nota: também atualizei a pergunta com mais detalhes).