如何加入过滤器(输入)表

时间:2019-02-08 21:26:52

标签: sql postgresql

因此,使用postgres时,我有一个函数可以接受json输入参数,可以将其读入记录集以加入到我的输出表中。输入参数只是充当过滤器的单个代码的列表。让我们假设我的桌子:

╔═════════╦══════════════╗
║ user_id ║  Group_id    ║
╠═════════╬══════════════╣
║  1      ║ 1            ║
║  1      ║ 2            ║
║  1      ║ 3            ║
║  1      ║ 4            ║
║  2      ║ 2            ║
║  2      ║ 4            ║
║  2      ║ 6            ║
║  2      ║ 8            ║
║  3      ║ 1            ║
║  3      ║ 3            ║
║  3      ║ 5            ║
╚═════════╩══════════════╝

可以说我的输入值为1 我想从表中选择所有属于组1的所有用户。在这种情况下,用户输出将是: 1、3

现在可以说输入更改为值1和2。这意味着我只想返回组1和2中的用户。在上面的示例中,它只应返回user_id = 1。 但是,按照我编写代码的方式,我返回所有具有1或2组的用户。我的代码在下面,我可以确切地知道为什么我得到了错误的结果,但是我想要的是通用的东西,以便我的输入可以接受任何给定数量的组ID,结果将仅返回属于所有传入的group_id的用户(已经过了一周,我确信这很容易实现,但有效地是我的目标:

CREATE OR REPLACE FUNCTION fn_get_users_filtered(p_in_filters json) 
RETURNS TABLE (user_id integer)
LANGUAGE plpgsql
AS $$

BEGIN

DROP TABLE IF EXISTS temp_user;

CREATE TEMPORARY TABLE temp_user (user_id integer);

INSERT INTO temp_user (user_id)
SELECT  u.user_id
FROM    user_groups u
JOIN    json_to_recordset(p_in_filters->'data') as j(code int)
ON      u.group_id = j.code

RETURN QUERY
SELECT  tu.user_id
FROM    temp_users tu;


END;

$$;

我从这段代码中删除了所有的gumpf,因此它专注于我想正确使用的位,因此可以忽略我不必要地使用临时表的事实。

SELECT * FROM fn_get_users_filtered('{"data":[{"name": "male","code": "1"}]}');

返回user_id 1和3-很好

SELECT * FROM fn_get_users_filtered('{"data":[{"name": "male","code": "1"},{"name":"Blonde","code":"2"}]}');

返回user_ids 1、2和3,因为过滤的行为类似于“或” 我希望它只返回满足两个过滤器值1和2的user_id = 1。

2 个答案:

答案 0 :(得分:0)

使用聚合并具有。这是一种方法:

select user_id
from t
where group_id in (1, 2)
group by user_id
having count(*) = 2;  -- the size of the in list

如果您想在wherehaving中使用相同的参数,则可以使用数组:

select user_id
from t
where t.group_id = any(array[1, 2])
group by user_id
having count(*) = cardinality(array[1, 2]);

Here是db <>小提琴。

答案 1 :(得分:0)

这是我有效执行的操作:

https://rextester.com/MGRI98968

感谢JGFMK向我指出正确的方向!