2016-07-13 11 views
0

私のPostgreSQLデータベースで、json列に特定のテキストが含まれている行を検索しようとしています。Postgresql:オブジェクトのjson配列内のテキストで行を検索

行スキーマ:

id | name   | subitems 
----------------------------------------------------------------- 
1 | "item 1"  | [{name: 'Subitem A'}, {name: 'Subitem B'}] 
2 | "item 2"  | [{name: 'Subitem C'}, {name: 'Subitem D'}] 

私は、クエリの結果たかった 'サブアイテムB'

id | name   | subitems 
----------------------------------------------------------------- 
1 | "item 1"  | [{name: 'Subitem A'}, {name: 'Subitem B'}] 
私はこのような最初のサブアイテムを検索することができ

WHERE lower(subitems->0->>\'name\') LIKE '%subitem a%' 

しかし、明らかに私他の副題を見つけることはできませんが、最初のものはこのようになります。

私は私のサブ項目のすべての名前を取得することができます

SELECT lower(json_array_elements(subitems)->>'name') FROM ... 

をしかし、それは私の名を含む2行います:私は実際にアイテムを含む1行で必要なもの

lower 
---------------------------------------------------------------- 
"subitem a" 
"subitem b" 

を。

どのようにすればいいのですか?

+0

あなたが探しているものは少し不明です - あなたにいくつかの例のデータと、あなたが望む出力の例も教えてください。 – jmelesky

+0

返信いただきありがとうございます、私の質問を更新しました – Jesse

答えて

1

あなたはほぼあります。あなたのお問い合わせ:

SELECT lower(json_array_elements(subitems)->>'name') FROM foo; 

あなたがフィルタリングしたいものが得られます。あなたはサブクエリの中に、あなたが探している結果を得ることウンチ場合:LIKEスタイルのマッチングをサポートするために、

オーケーを追加する

# SELECT * 
    FROM foo f1 
    WHERE 'subitem a' IN 
     (SELECT lower(json_array_elements(subitems)->>'name') 
     FROM foo f2 WHERE f1.id = f2.id 
    ); 
id | name |     subitems      
----+--------+------------------------------------------------ 
    1 | item 1 | [{"name": "Subitem A"}, {"name": "Subitem B"}] 
(1 row) 

を編集し、あなたが行く必要がありますサブクエリにサブクエリを配置します。これは読みにくいので、common table expressionsを使用しています。

WITH all_subitems AS (
    SELECT id, json_array_elements(subitems)->>'name' AS subitem 
    FROM foo), 
matching_items AS (
    SELECT id 
    FROM all_subitems 
    WHERE 
     lower(subitem) LIKE '%subitem a%') 
SELECT * 
    FROM foo 
    WHERE 
    id IN (SELECT id from matching_items); 

これで、必要なものを手に入れることができます。私はlowerへのコールをレベルアップしたので、LIKEと並んでいます。つまり、フィルタリング条件が1つの場所にあるため、正規表現の一致に切り替えることができます。

+0

ありがとうございます。文字列が正確に一致している限り、魅力のように機能します!これでLIKEの '%query%'構文を使用する方法も知っていますか? – Jesse

+0

これを追加する編集された応答。 – jmelesky

+0

完璧な、それは動作します。再び、時間をかけて私を助けてくれてありがとう! 私はこれを使用しているデータベースがかなり大きくなるにつれて、パフォーマンスについて少し気になります。あなたはそれについて何か知っていますか? – Jesse

関連する問題