首页 > 数据库 >postgresql自定义函数实现三个数组存在相同数据,且在第四个数组中不存在的数据

postgresql自定义函数实现三个数组存在相同数据,且在第四个数组中不存在的数据

时间:2024-03-29 19:11:25浏览次数:25  
标签:postgresql users 自定义 text json 数组 array SELECT

-- 使用postgresql 语言写一个函数,实现以下功能:
-- 1 有管理权限用户数组、列表权限用户数组、查看权限用户数组、无权限用户数组四个用户数组
-- 2 当无权限用户数组存在用户数据时,如果管理权限用户数组,列表权限用户数组,查看权限用户数组中存在相同的用户数据,并且和无权限用户数组的用户数据不同,则返回其他三个数组中相同的数据
-- 3 举个例子: 无权限用户数组存在A、B用户数据,管理权限用户数组存在A、B、C用户,列表权限用户数组存在A、B、C用户,查看权限用户数组存在A、B、C用户,则返回C用户数据

CREATE OR REPLACE FUNCTION find_permission_conflicts(
    admin_users text[],
    manager_users text[],
    viewer_users text[],
    no_permission_users text[]
)
RETURNS text[] AS
$$
DECLARE
    conflicts text[];
    no_permission_set text[];
BEGIN
    -- 将无权限用户数组转换为集合
    no_permission_set := ARRAY(SELECT unnest(no_permission_users));

    -- 查找管理、列表和查看数组的交集
    conflicts := ARRAY(
        SELECT user_id
        FROM unnest(admin_users) AS user_id
        WHERE user_id = ANY(manager_users) AND user_id = ANY(viewer_users)
        EXCEPT
        SELECT unnest(no_permission_set)
    );

    RETURN conflicts;
END;
$$
LANGUAGE plpgsql;
-- 举例子
SELECT find_permission_conflicts(
      ARRAY['A', 'B', 'C', 'D'],
    ARRAY['A', 'B', 'C', 'D'],
    ARRAY['A', 'B', 'C' ,'D'],
    ARRAY['A', 'B']
)AS conflicts;

-- 实战
SELECT array_length( find_permission_conflicts(
    (SELECT array(select json_array_elements_text('{"users":["1685947296799670271","1685947296799670272","1685947296799670273","1685947296799670274"],"roles":[],"groups":[],"organizations":[]}'::json->'users'))),
    (SELECT array(select json_array_elements_text('{"users":["1685947296799670271","1685947296799670272","1685947296799670273","1685947296799670274"],"roles":[],"groups":[],"organizations":[]}'::json->'users'))),
    (SELECT array(select json_array_elements_text('{"users":["1685947296799670271","1685947296799670272","1685947296799670273","1685947296799670274"],"roles":[],"groups":[],"organizations":[]}'::json->'users'))),
    (SELECT array(select json_array_elements_text('{"users":["1685947296799670271","1685947296799670272"],"roles":[],"groups":[],"organizations":[]}'::json->'users')))
),1) AS conflicts;


SELECT find_permission_conflicts(
    (SELECT array(select json_array_elements_text('{"users":["1685947296799670271","1685947296799670272","1685947296799670273","1685947296799670274"],"roles":[],"groups":[],"organizations":[]}'::json->'users'))),
    (SELECT array(select json_array_elements_text('{"users":["1685947296799670271","1685947296799670272","1685947296799670273","1685947296799670274"],"roles":[],"groups":[],"organizations":[]}'::json->'users'))),
    (SELECT array(select json_array_elements_text('{"users":["1685947296799670271","1685947296799670272","1685947296799670273","1685947296799670274"],"roles":[],"groups":[],"organizations":[]}'::json->'users'))),
    (SELECT array(select json_array_elements_text('{"users":["1685947296799670271","1685947296799670272"],"roles":[],"groups":[],"organizations":[]}'::json->'users')))
) AS conflicts;

标签:postgresql,users,自定义,text,json,数组,array,SELECT
From: https://www.cnblogs.com/ysloong/p/18104449

相关文章

  • elementUI——el-form表单数据校验(包含数组循环)
    一、普通的值类型的数据校验①设置el-form-item的prop值与formdata中定义的key保持一致`②如果rules需要通过el-form统一设置,rules的key定义也与prop保持一致(如果不一致,需要在el-form-item中手动指定)③复杂的校验函数可通过validator单独定义<el-form......
  • 代码随想录算法训练营第二十三天(二叉树9)|669. 修剪二叉搜索树、108. 将有序数组转换为
    文章目录669.修剪二叉搜索树解题思路源码108.将有序数组转换为二叉搜索树解题思路源码538.把二叉搜索树转换为累加树解题思路源码669.修剪二叉搜索树给你二叉搜索树的根节点root,同时给定最小边界low和最大边界high。通过修剪二叉搜索树,使得所有节点的值......
  • Java 的数组详解
    数组的定义数组是相同类型数据的有序集合数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标(编号、标记)来访问它,下标是从0开始的,如果是存10个数组,那么下标是从0~9的代码举例publ......
  • Leetcode 长度最小的子数组
    Day13第一题超出运行时间,两层循环classSolution{publicintminSubArrayLen(inttarget,int[]nums){if(Arrays.stream(nums).sum()<target){return0;}intminSubArrayLen=nums.length;OUT:......
  • 2024-03-29 js练习之生成多个数组,且每个数组内的值不能重复
    代码:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"/><metaname="viewport"content="width=device-width,initial-scale=1.0"/><title>doubleBox</t......
  • QT 自定义插件问题 error: LNK2001: 无法解析的外部符号
    为了重复利用已有的代码,我使用自定义插件进行开发。当每个插件独立开发时没有遇到问题,但是当插件B引用了插件A时就会在编译时报错error:LNK2001:无法解析的外部符号。例如,先定义一个插件ColorPicker,用于颜色选取。关键代码如下:classQDESIGNER_WIDGET_EXPORTColorPicker:......
  • 数组应用实例1 —— 三子棋
    数组应用实例1——三子棋文章目录数组应用实例1——三子棋一、标识符常量的定义和头文件的包含二、主函数`main()`三、测试游戏逻辑`test()`四、菜单界面`menu()`五、游戏实现`game()`六、初始化棋盘`InitBoard()`1函数原型2函数实现七、打印棋盘`DisplayB......
  • 【数据库】postgresql截取最后一个字符之前的所有字符,如V1.0.0.20230731110947中取V1.
    在PostgreSQL中,我们可以使用position函数和split_part函数来截取最后一个.之前的所有字符。这两个函数都非常有用,尤其是在处理文本数据时。position函数position函数用于查找一个字符串中某个子串的位置。它的语法如下:POSITION(substringINstring)其中,substring是要查找的......
  • H5get请求重定向后页面没有跳转重定向的地址是什么问题;H5get请求重定向后页面不跳转自
    Ajax请求的处理:如果使用了XMLHttpRequest或FetchAPI进行GET请求,并通过异步处理来获取响应数据,那么浏览器不会自动跳转到重定向的地址。如果在H5的GET请求中,服务器返回了重定向响应(HTTP状态码为3xx),但页面没有跳转到重定向的地址,可能有几种可能的原因:JavaScript......
  • 除自身以外数组的乘积 - LeetCode 热题 16
    大家好!我是曾续缘......