2017-11-25 9 views
1

プレーンPL/pgSQLでエンティティを一致させる方法はありますか?2つのテーブルの行を属性で一致させる

SELECT id, first_name, last_name, birthdate 
    FROM customers_index 
    WHERE first_name @@ plainto_tsquery('simple','John') 
     AND last_name @@ plainto_tsquery('simple','Smith') 
     AND birthdate = '17.08.1967'; 

しかし、私ので、すべての人のためにこれを行うと、少し退屈です: だが、私は試合を識別するために、3つの属性を比較するテキスト検索クエリを使用して、顧客テーブル内の一人を検索したいとしましょう私がこのようにしたい人のテーブルを全部持っています。任意の "通常のプログラミング言語"の助けを借りて、私は新しいテーブルとしてすべての行のための既存の一致を見つけるまで、今は本当の配列をループするだろうが、プレーンPL/pgSQLでこれを行う方法はありますか?

答えて

1

私は入力パラメータとして配列と組み合わせ(OracleのPL/SQLに類似)PL/pgSQLで機能がうまく働くだろうと思う:

CREATE OR REPLACE FUNCTION customers(first_names text[], last_names text[], 
    birthdays date[]) 
    RETURNS SETOF customers_index as 
$BODY$ 
DECLARE 
    i integer; 
    elements integer; 
    rw customers_index%rowtype; 
BEGIN 

    elements := array_length (first_names); 

    for i in 1..elements loop 

    for rw in SELECT ci.* 
     FROM customers_index ci 
     WHERE ci.first_name @@ plainto_tsquery('simple', first_names[i]) 
     AND ci.last_name @@ plainto_tsquery('simple', last_names[i]) 
     AND ci.birthdate = birthdays[i] 
    loop 
     return next rw; 
    end loop; 
    end loop; 

    return; 

END; 
$BODY$ 
    LANGUAGE plpgsql VOLATILE 
    COST 100; 

そして、実装は次のようなものになります。

select 
    id, first_name, last_name, birthdate 
from 
    customers(array['John', 'Jane'], array['Smith', 'Doe'], 
     array ['17.08.1967', '16.07.1970']) 

もちろん、データが他の場所から来たと仮定すると、実際の実装ははるかにクリーンに見えるはずです。

また、これは超効率的であるとは約束していませんが、AからBへの素早いパスであり、いくつかのGINインデックスや、少なくとも実際にはかなり誕生日のインデックスうまく。

+0

ありがとうございます、私はあなたの提案に基づいて、実用的なソリューションを作成することができました。わずかな問題:array_length()は2つのパラメータを必要とするため、array_length(first_names、1)がジョブを実行しました。他に誰も解決策を教えてくれていないので、私はあなたの解決策を最良の答えとしてマークします。 – MayaK

関連する問題