における入力値との結合します。テーブルの選択は、関数で指定された入力値に依存します。私は書いた:私は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を照会書くことができます。 'letter_type <> 'アルファベット'のとき、id3のヌル値を表示します。 – midtownguru
@midtownguru。 。 。重要な違いがあります。しかし、私がwhere句を省いたことを指摘してくれてありがとう。 –
私は 'left join'ロジックを得ました。質問で私の最後のコードを見ることができます。面白いことに私には、合併症と 'letter_type'が条件にあることが問題を解決しました。 – midtownguru