首页 > 解决方案 > PostgreSQL 中的条件 CTE

问题描述

我正在尝试编写一个动态查询。我试图尽可能简化这一点。@Condition并且@Filter是查询的动态输入。

有两种情况:

伪代码有点像这样:

WITH selected_metadata AS (
    IF (@Condition = TRUE) {
        -- Do not filter on metadata
        SELECT NULL;
    }
    ELSE {
        -- Find the matching metadata rows
        SELECT id FROM metadata WHERE field = @Filter
    }
)
SELECT 
    *
FROM data
WHERE
    (
        -- Ignore the metadata filter
        selected_metadata IS NULL 
        OR
        -- Filter on metadata
        data.metadataid IN (selected_metadata)
    )
    ...more filters

我认为没有 CTE 可能有更简单的方法可以做到这一点,但由于查询在现实生活中的样子,我认为我需要将其拆分以最小化复杂性。

标签: sqlpostgresqlpostgresql-9.6

解决方案


我认为您可以尝试在 where 而不是直接在 CTE 中设置这些条件。

SELECT 
    *
FROM data
WHERE
    (
        -- Ignore the metadata filter
        @Condition = TRUE
        OR
        -- Filter on metadata
        @Condition = FALSE AND data.metadataid IN (SELECT ID FROM selected_metadata AND field = @Filter)
    )
    ...more filters

推荐阅读