动态where条件PostgreSQL

Dynamic where condition PostgreSQL

我正在构建一个 CRUD 应用程序,它允许用户输入一些搜索条件并获取与这些条件对应的文档。不幸的是,我在根据用户发送的输入在 where 部分使用不同条件的 postgres 中创建查询时遇到了一些困难。

例如,如果用户仅将文档编号设置为搜索条件,则查询将定义如下:

select * from document where document_num = "value1"

另一方面,如果用户给出两个条件,查询将设置如下:

select * from document where document_num = "value1" and reg_date = "value2"

如何设置对所有情况都有效的查询?查看其他线程,我认为在 where 部分使用 coalesce 是一种可能的解决方案:

document_num = coalesce("value1", document_num)

这种方法的问题是,当没有提供任何值时,postgres 会将条件转换为 document_num IS NOT NULL,这不是我需要的(我的目标是将条件设置为始终为真)。

提前致谢

如果我没理解错的话,你可以尝试通过参数传递用户输入值

参数默认值可能会设计成用户不能传,如果用户不想使用参数就会使用默认值。

我们可以用OR判断是否使用参数否则忽略

SELECT * 
FROM document 
WHERE (document_num = :value1 OR :value1 = [default value]) 
AND (reg_date = :value2 OR :value2 = [default value])

因此,如果您有默认值,@D-shih 的解决方案将有效,您也可以使用 COALESCE,如下所示。

SELECT *
FROM document
WHERE document_num = COALESCE("value1", default_value)
AND reg_date = COALESCE("value2", default_value);

如果您没有默认值,那么您可以使用 CASE WHEN 创建查询(这里我假设您有一些变量,您可以从中确定要应用的条件,例如何时应用 document_num 或何时应用 reg_date 或何时应用两者)。下面举个小例子。

SELECT *
FROM document
WHERE
(
    CASE
        WHEN "value1" IS NOT NULL THEN document_num = "value1"
        ELSE TRUE
    END
) 
AND (
    CASE
        WHEN "value2" IS NOT NULL THEN reg_date = "value2"
        ELSE TRUE
    END
)

您可以阅读更多如何使用 CASE WHEN here