因此,使用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。
答案 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
如果您想在where
和having
中使用相同的参数,则可以使用数组:
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)