Условный CTE в PostgreSQL - PullRequest
       17

Условный CTE в PostgreSQL

0 голосов
/ 25 марта 2019

Я пытаюсь написать динамический запрос.Я пытался упростить это как можно лучше.@Condition и @Filter - динамические входные данные запроса.

Существует два случая:

  • Если @Condition равно TRUE, то не фильтруйте data при наличии любого metadata
  • В противном случае найдите строки metadata, которые соответствуют определенному фильтру, и отфильтруйте data по ним.

Псевдокод выглядит примерно так:

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, но из-за того, как запрос выглядит в реальной жизни.Я думаю, мне нужно разделить его, чтобы минимизировать сложность.

Ответы [ 2 ]

1 голос
/ 25 марта 2019

Я думаю, что вы можете попытаться установить те условия, где вместо 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
0 голосов
/ 25 марта 2019

Попробуйте что-то вроде этого:

WITH selected_metadata AS (
  -- Find the matching metadata rows
  SELECT id FROM metadata WHERE field = @Filter OR @Condition <> TRUE
)
SELECT ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...