假设我有以下功能:
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$;
true
如果$1
匹配则返回'test'
or 'bar'
。
如何在另一个ANY
查询中使用此函数?例如:
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')
但是这个语法是不正确的。而且我不太清楚如何正确地写这个。
编辑:更多细节
本质上我想要做的是检查一组列中的任何一个是否包含任何一个禁止的术语。换句话说,我有一组禁止的术语,并且必须检查多个列以包含该词。这稍后将用于 RLS 策略。在下面的示例中,函数contains_forbidden_term
是我希望能够编写的函数。
一个小而重要的注意事项:必须将相同的函数应用于其他表,但参数数量不同(因此数组作为参数类型)。
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;
您可以将第一个函数与一起使用,
ANY
但必须具有您发现的有效语法 (<expression> <**operator**> ANY ...
)。所以下面会起作用(“技巧”部分是使用unnest()
whild 将数组展开成行):或更紧凑的:
从文档来看,查询的语法似乎
ANY/ALL
必须是我继续朝着这个方向努力,并提出了以下可行的方法:
但这似乎有点像做一些简单事情的迂回方式,我想知道我是否在戴着眼罩看不到更简单的解决方案时没有陷入兔子洞(注意:我还更详细地更新了问题)。