Как проверить «любой или ограниченный» в предложении WHERE запроса? - PullRequest
0 голосов
/ 15 мая 2018

У меня есть эта функция plpgsql:

CREATE OR REPLACE FUNCTION func_example(
    IN  check_ids      INT [],
    OUT recs           REFCURSOR,
    OUT po_result_code TEXT
) RETURNS RECORD LANGUAGE plpgsql AS $$
BEGIN
    OPEN recs FOR
    SELECT *
    FROM my_table t
      JOIN my_another_table tt on tt.tid = t.id
    WHERE t.enabled = TRUE
          AND tt.some = 1
          AND (
              check_ids IS NULL OR check_ids.count = 0 /* <-- problem here */
              OR t.id = ANY (check_ids)
          );

    po_result_code := 0;
    RETURN;
END;
$$;

При ее вызове появляется сообщение об ошибке:

Error: [42P01] ERROR: missing FROM-clause entry for table "check_ids"  
SQL state: 42P01

Как проверить, что аргумент равен нулю или значениюв аргументе '?

Некоторые примеры данных:

CREATE TABLE my_table (
    id      INT,
    enabled BOOLEAN DEFAULT TRUE
);
CREATE TABLE my_another_table (
    tid    INT,
    "some" INT DEFAULT 1,
    CONSTRAINT t_another_to_my_fk FOREIGN KEY (tid) REFERENCES my_table (id)
);
INSERT INTO my_table (id, enabled) VALUES (1, TRUE);
INSERT INTO my_another_table (tid, "some") VALUES (1, 1);

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Также пропустить NULL и пустой массив , заменить:

(t.id = ANY (check_ids) OR check_ids IS NULL OR check_ids.count = 0)  -- illegal syntax

с одним выражением:

(t.id = ANY (check_ids) OR <b>(check_ids = '{}') IS NOT FALSE</b>)

Это тоже будет работать, но немного медленнее:

(t.id = ANY (check_ids) OR check_ids IS NULL OR check_ids = '{}')

Тесно связанный ответ для строковых типов с подробным объяснением:

Тем не менее, ваш актуальный вопрос требует чего-то отличается :

Как проверить, «аргумент равен нулю или значение в аргументе»?

Это сгорит просто:

(t.id = ANY (check_ids) OR check_ids IS NULL)

Все это относится к области SQL и не связано с PL / pgSQL.

0 голосов
/ 15 мая 2018

Заменить check_ids.count на array_length(check_ids, 1).

...