我想编写一个SELECT语句,如下所示:
SELECT field_a
FROM my_table
WHERE field_b IN (my_function(field_c)).
这可能吗?
my_function
必须返回一个数组吗?
我正在使用PostgreSQL 8.2
答案 0 :(得分:5)
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
。
对于相关子查询,这是不可能的。
答案 1 :(得分:0)
只要my_function的返回类型只是一个与field_b类型相同的结果集(如Varchar(20)或int),那么你应该没问题。