AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 196205
Accepted
exhuma
exhuma
Asked: 2018-01-26 01:48:41 +0800 CST2018-01-26 01:48:41 +0800 CST 2018-01-26 01:48:41 +0800 CST

如何在“ANY”/“ALL”查询中使用 1 参数函数?

  • 772

假设我有以下功能:

 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;
postgresql
  • 2 2 个回答
  • 211 Views

2 个回答

  • Voted
  1. Best Answer
    ypercubeᵀᴹ
    2018-01-26T02:57:29+08:002018-01-26T02:57:29+08:00

    您可以将第一个函数与一起使用,ANY但必须具有您发现的有效语法 ( <expression> <**operator**> ANY ...)。所以下面会起作用(“技巧”部分是使用unnest()whild 将数组展开成行):

    SELECT true = ANY (select myfun(x) from unnest(ARRAY['test', 'world']) as x) ;
    

    或更紧凑的:

    SELECT true = ANY (select myfun(unnest(ARRAY['tt', 'foo']))) ;
    
    • 4
  2. exhuma
    2018-01-26T02:39:23+08:002018-01-26T02:39:23+08:00

    从文档来看,查询的语法似乎ANY/ALL必须是

    <expression> <**operator**> ANY ...
    

    我继续朝着这个方向努力,并提出了以下可行的方法:

    CREATE OR REPLACE FUNCTION myoperator(IN boolean, IN TEXT)
    RETURNS boolean
    LANGUAGE SQL
    IMMUTABLE
    LEAKPROOF
    AS $CODE$
        SELECT COALESCE(
            $2 ILIKE ANY (ARRAY[
                'test',
                'bar'
            ]),
            false
        ) = $1;
    $CODE$;
    
    CREATE OPERATOR <<< (
        PROCEDURE = myoperator,
        LEFTARG = boolean,
        RIGHTARG = TEXT
    );
    
    CREATE OR REPLACE FUNCTION contains_forbidden_term(IN TEXT[])
    RETURNS boolean
    LANGUAGE plpgsql
    LEAKPROOF
    IMMUTABLE
    AS $CODE$
        BEGIN
        RETURN NOT (true <<< ANY($1));
        END
    $CODE$;
    
    SELECT true <<< ANY (ARRAY['foo', 'bar']);
    SELECT true <<< ANY (ARRAY['this', 'is', 'ok']);
    

    但这似乎有点像做一些简单事情的迂回方式,我想知道我是否在戴着眼罩看不到更简单的解决方案时没有陷入兔子洞(注意:我还更详细地更新了问题)。

    • 1

相关问题

  • 我可以在使用数据库后激活 PITR 吗?

  • 运行时间偏移延迟复制的最佳实践

  • 存储过程可以防止 SQL 注入吗?

  • PostgreSQL 中 UniProt 的生物序列

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve