2016-07-02 15 views
1

私はoccasionrelationのテーブルを持っています。 relation.occasionsはjsonタイプのフィールドで、機会の配列を含んでいます。私はのレコードを関係で取得したいと考えています。をrelation.occasionsにします。これは私のDBのデータであることを、前提としていますPostgreSQLの使い方json_array_elements whit WHERE <value> IN節

機会

 key  |  name  | 
------------------------------------- 
    BIRTHDAY  | Birthday | 
    ANNIVERSARY | Anniversary | 

関係

key   | occasions       | 
------------------------------------------------------ 
    FATHER  | [ "BIRTHDAY", "ANNIVERSARY" ] | 
    FRIEND  | [ "BIRTHDAY" ]     | 

は、ここで私が使用しようとしているクエリです:

SELECT * FROM occasion o WHERE o.key IN 
(SELECT json_array_elements(r.occasions)::text from relation r WHERE r.key = 'FATHER') 

結果は0行です2.誰かが私に間違っていることをヒントを与えることができますか?どのように私は希望の結果を達成することができますか?

答えて

2

関数json_array_elements()は、配列ではなくセットを返します。したがって、選択リストではなく行ソースとして使用する必要があります。

正しいクエリは次のようになります。

SELECT o.* 
FROM occasion o 
JOIN (
    SELECT DISTINCT j.value 
    FROM relation 
    JOIN LATERAL json_array_elements_text(occasions) j(value) ON true 
    WHERE key = 'FATHER') sub ON o.key = sub.value; 

また、サブクエリなしでそれを平らにすることができますが、私は(問い合わせプランナはとにかく平坦化を行います)、このバージョンは、より読みであることがわかりました。

+0

'select o。* from occasion o join relation r on(o.key = any(json_array_elements_text(r.occasions)を選択)とr.key = 'FATHER');' - より簡単ですが、キーはユニークです。 – Abelisto

+0

@Abelisto選択リストでSRFを使用することは避けてください。[クエリのFROM句でテーブル、ビュー、またはサブクエリのように使用されます。](https://www.postgresql.org/docs/9.5/ static/queries-table-expressions.html#QUERIES-TABLEFUNCTIONS) – Patrick

+0

あなたのリンクは、SRFの使用についてではなく、 'FROM'節に関するものです。 [SELECTリターン関数の設定](https://www.postgresql.org/docs/9.5/static/functions-srf.html)、公式ドキュメントの例: 'SELECT generate_series(1.1、4、1.3);' – Abelisto