2017-05-09 6 views
0

における入力値との結合します。テーブルの選択は、関数で指定された入力値に依存します。私は書いた:私は3つのテーブルを有するpostgreslq機能

CREATE OR REPLACE FUNCTION choose_letters(letter_type text) 
    RETURNS table (id integer,letter text) AS $$ 
BEGIN 
    RETURN QUERY 
    select t1.id, 
     case when letter_type = 'alphabet' then t2.letter else t3.letter end as letter 
    from id_table t1, 
     alphabet_table t2 , 
     greek_table t3 
    where t1.id = t2.id and t1.id = t3.id; 

END; 
$$LANGUAGE plpgsql; 

私はselect choose_letter('alphabet')を走った。このコードの問題は、id_tableがalphabet_tableと結合したときにidがNo3になるということです。内部結合は、alphabet_tableとgreek_tableの両方で行われるようです(共通ID、1と2を選択するだけです)。この問題を回避するために、私が書いた:

CREATE OR REPLACE FUNCTION choose_letters(letter_type text) 
    RETURNS table (id integer, letter text) AS $$ 
BEGIN 
    RETURN QUERY 
    select t1.id, 
     case when letter_type = 'alphabet' then t2.letter else t3.letter end as letter 
    from id_table t1 
    left join alphabet_table t2 on t1.id=t2.id 
    left join greek_table t3 on t1.id=t3.id 
    where t2.letter is not null or t3.letter is not null; 

END; 
$$LANGUAGE plpgsql; 

を今ではときid_tableすべての3つのIDをピックアップし、alphabet_table参加します。しかし、私がselect choose_letter('greek')を実行したとき。 ID番号。 3はwhere句にt3.letter is not nullを指定したにもかかわらず、文字列にnull値が表示されます。

select choose_letters('alphabet')を実行したとき、出力は(1、 'a')、(2、 'b')、(3、 'c')である必要があります。 select choose_letters('greek')は(1、 'alpha')、(2、 'beta)を生成します。欠損値もヌルもありません。どうすればこれを達成できますか?

答えて

1

正しい、明示的なJOIN構文を使用する方法を学んでください。単純なルール:は、FROM句にカンマを使用します。

あなたはLEFT JOINといくつかの他のロジックでやりたいことができます。

select i.id, 
     coalesce(a.letter, g.letter) as letter 
from id_table i left join 
    alphabet_table a 
    on i.id = a.id and letter_type = 'alphabet' left join 
    greek_table g 
    on i.id = g.id and letter_type <> 'alphabet' 
where a.id is not null or g.id is not null; 

on節にあるようにletter_typeニーズを使用して条件。それ以外の場合、alphabet_tableは常に一致します。

+0

他の部分にある場合に1を照会書くことができます。 'letter_type <> 'アルファベット'のとき、id3のヌル値を表示します。 – midtownguru

+0

@midtownguru。 。 。重要な違いがあります。しかし、私がwhere句を省いたことを指摘してくれてありがとう。 –

+0

私は 'left join'ロジックを得ました。質問で私の最後のコードを見ることができます。面白いことに私には、合併症と 'letter_type'が条件にあることが問題を解決しました。 – midtownguru

0

最初の問題はあなたのテーブルか正しく構成されていません。char_table(id int、letter text、type text)のような単一のテーブルを作成すると、アルファベットかギリシャ語かを指定します。

別の解決策は、2つのSQL条件もう一つはこれが問題の第二のコードとほぼ同じである

関連する問題