2009-05-14 10 views
3

の結果であるSELECT文を書くことができます。はどうすれば条件は、私は次のようにSELECT文を書きたい機能

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

が可能ということですか?

my_functionは配列を返す必要がありますか?私は限りは、my_functionの戻り値の型がfield_bと同じタイプのセットだけの結果であるとして(VARCHAR(20)、またはint型のように)、あなたは問題ないはず

+0

ありがとう、Quassnoi! – danielpradilla

答えて

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)) 

を、しかし、もしあなたの関数は複雑な型を返します。前者のスタイルは、次のように複雑な型の1つのフィールドと比較して1つのクエリ内の他のフィールドを返すことができるため、好ましい形式です。

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の両方を返します。

これは、相関サブクエリでは不可能です。

+0

あなたはSETOFの戻り値の型については正しいですが、例のクエリはもっと​​簡単かもしれません - "... WHERE field_b IN(SELECT my_function(field_c))"。 –

+0

シンプルではありません。特に関数を使った副選択は、パフォーマンスを低下させます。派生テーブルは、ほとんどの場合、副選択よりも優先されます。 – HLGEM

+0

@Milen:already there :) – Quassnoi

0

のPostgreSQL 8.2を使用してい

関連する問題