如何在PostgreSQL中为用户过滤创建这个可选的WHERE子句?

xjreopfe  于 2023-08-04  发布在  PostgreSQL
关注(0)|答案(1)|浏览(119)

在我的前端,我有一个multiselect,允许用户过滤客户端。然而,用户可能只想用“country”和“bonus_points”进行过滤…留下其它滤波器未使用。
我有两个包含用户数据的表。。users和users_ext.如何创建一个查询来有条件地检查这些WHERE子句?
另外,作为奖励,我如何允许一个可选的EXCLUSION过滤器?是否可以在一个查询中完成所有这些?

SELECT uuid
    FROM users
    JOIN users_ext ON users.uuid = users_ext.uuid
    WHERE ($1 IS NULL OR users_ext.country IN (ARRAY[$1])) AND
    WHERE ($2 IS NULL OR users.birthday IN (ARRAY[$2])) AND
    WHERE ($3 IS NULL OR users_ext.account_age IN (ARRAY[$3])) AND
    WHERE ($4 IS NULL OR users_ext.bonus_points IN (ARRAY[$4]))

字符串

falq053o

falq053o1#

从一段有效的SQL开始,如下所示:

SELECT uuid
    FROM users
    JOIN users_ext ON users.uuid = users_ext.uuid
WHERE TRUE

字符串
当你有一些过滤器时,添加额外的条件:

AND ($1 IS NULL OR users_ext.country =ANY (ARRAY[$1]))


还有一个条件:

AND ($2 IS NULL OR users.birthday =ANY (ARRAY[$2]))


所有这些加在一起,你会得到这样的东西:

SELECT uuid
    FROM users
    JOIN users_ext ON users.uuid = users_ext.uuid
WHERE TRUE -- to get a correct WHERE in your statement
AND ($1 IS NULL OR users_ext.country =ANY (ARRAY[$1]))
AND ($2 IS NULL OR users.birthday =ANY (ARRAY[$2]))


但是正如您所知道的,在(子)查询中只能有一个WHERE

相关问题