PostgreSQL中的条件CTE

时间:2019-03-25 08:41:55

标签: sql postgresql postgresql-9.6

我正在尝试编写动态查询。我已经尽力简化了。 middleware two@Condition是查询的动态输入。

有两种情况:

  • 如果@Filter@Condition,则不要在存在任何TRUE的情况下过滤data
  • 否则,找到与某个文件管理器匹配的metadata行,并在这些行上过滤metadata

伪代码有点像这样:

data

我认为没有CTE可能会有更简便的方法,但是由于查询在现实生活中的外观,我认为我需要将其拆分以最大程度地减少复杂性。

2 个答案:

答案 0 :(得分:1)

我认为您可以尝试将条件设置在哪里,而不是直接在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

答案 1 :(得分:0)

尝试这样的事情:

WITH selected_metadata AS (
  -- Find the matching metadata rows
  SELECT id FROM metadata WHERE field = @Filter OR @Condition <> TRUE
)
SELECT ...