如何编写SELECT语句,其中条件是函数的结果

时间:2009-05-14 16:52:48

标签: sql postgresql

我想编写一个SELECT语句,如下所示:

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

这可能吗?

my_function必须返回一个数组吗?

我正在使用PostgreSQL 8.2

2 个答案:

答案 0 :(得分:5)

SELECT  *
FROM    (
        SELECT  field_a, field_b, my_function(field_c) fc
        FROM    mytable
        ) q
WHERE   field_b = fc

您的函数的返回类型应为SETOF(例如SETOF INTSETOF 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进行比较,并返回column1column2

对于相关子查询,这是不可能的。

答案 1 :(得分:0)

只要my_function的返回类型只是一个与field_b类型相同的结果集(如Varchar(20)或int),那么你应该没问题。