Как я могу написать оператор SELECT, в котором условие является результатом функции - PullRequest
3 голосов
/ 14 мая 2009

Я хочу написать инструкцию SELECT следующим образом:

SELECT field_a 
FROM my_table
WHERE field_b IN (my_function(field_c)).

Возможно ли это?

my_function должен был бы вернуть массив?

Я использую PostgreSQL 8.2

Ответы [ 2 ]

5 голосов
/ 14 мая 2009
SELECT  *
FROM    (
        SELECT  field_a, field_b, my_function(field_c) fc
        FROM    mytable
        ) q
WHERE   field_b = fc

Тип возврата вашей функции должен быть SETOF (например, SETOF INT, SETOF VARCHAR и т. Д.)

Обратите внимание, что вы можете использовать выражение стиля IN, например:

SELECT  field_a, field_b
FROM    mytable
WHERE   field_b IN (SELECT my_function(field_c))

, но если ваша функция возвращает сложный тип, предпочтительнее использовать прежний стиль, поскольку вы можете сравнить одно поле сложного типа и вернуть другое в одном запросе, например:

FUNCTION my_function RETURNS SETOF anothertable

/* This will return a set of records of same layout as in table "anothertable" */

SELECT  field_a, field_b, fc.column1, fc.column2
FROM    (
        SELECT  field_a, field_b, my_function(field_c) fc
        FROM    mytable
        ) q
WHERE   field_b = fc.column1

Здесь мы сравниваем с column1 и возвращаем column1 и column2.

Это было бы невозможно с коррелированным подзапросом.

0 голосов
/ 14 мая 2009

Поскольку тип возвращаемого значения my_function является просто набором результатов того же типа, что и field_b (например, Varchar (20) или int), с вами все будет в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...