[解決済み] JSON型内の配列要素を問い合わせる
質問
をテストしようとしているのですが
json
という型を PostgreSQL 9.3 で使用することができます。
私の場合は
json
というカラムがあります。
data
というテーブルの中で
reports
. JSONは次のようなものです。
{
"objects": [
{"src":"foo.png"},
{"src":"bar.png"}
],
"background":"background.png"
}
objects' 配列の 'src' 値に一致するすべてのレポートをテーブルに照会したいのですが、どうすればよいですか?例えば、次のような場合、DBに問い合わせることは可能ですか?
'src' = 'foo.png'
? をマッチングさせるクエリを書くことに成功しました。
"background"
:
SELECT data AS data FROM reports where data->>'background' = 'background.png'
しかし
"objects"
は値の配列を持っているので、うまく書けそうにありません。と一致するすべてのレポートをDBに問い合わせることは可能でしょうか?
'src' = 'foo.png'
? これらのソースに目を通しましたが、まだ手に入りません。
- http://www.postgresql.org/docs/9.3/static/functions-json.html
- 新しいPostgreSQL JSONデータ型内のフィールドを使用してクエリを実行するにはどうすればよいですか?
- http://michael.otacoo.com/postgresql-2/postgres-9-3-feature-highlight-json-operators/
などとも試しましたが、効果がありません。
SELECT json_array_elements(data->'objects') AS data from reports
WHERE data->>'src' = 'foo.png';
私はSQLの専門家ではないので、何が間違っているのかわかりません。
どのように解決するのですか?
jsonb
Postgres 9.4+の場合
あなたは
可能
は、以下のように同じクエリを使用します。
jsonb_array_elements()
.
しかし、むしろ
jsonb
演算子
@>
という式に一致するGINインデックスと組み合わせて使用します。
data->'objects'
:
CREATE INDEX reports_data_gin_idx ON reports
USING gin ((data->'objects') jsonb_path_ops);
SELECT * FROM reports WHERE data->'objects' @> '[{"src":"foo.png"}]';
キーであるため
objects
にはJSONの
配列
の場合、検索語の構造に合わせ、配列の要素も角括弧でくくる必要があります。プレーンなレコードを検索する場合は、配列の括弧を削除してください。
より詳しい説明とオプション
json
Postgres 9.3+の場合
JSON配列のアンネストを行う関数です。
json_array_elements()
の横結合で
FROM
節を作成し、その要素をテストする。
SELECT data::text, obj
FROM reports r, json_array_elements(r.data#>'{objects}') obj
WHERE obj->>'src' = 'foo.png';
または、単なる シングル レベルのネスト。
SELECT *
FROM reports r, json_array_elements(r.data->'objects') obj
WHERE obj->>'src' = 'foo.png';
->>
,
->
と
#>
演算子については、マニュアルで解説しています。
どちらのクエリも、暗黙のうちに
JOIN LATERAL
.
密接に関連している。
関連
-
ERROR 1136 (21S01) を解決してください。列の数が Mysql の行 1 の値の数と一致しません。
-
[解決済み] SQLサーバーでNULL = NULLがfalseに評価される理由
-
[解決済み] 正しいJSONコンテンツタイプは何ですか?
-
[解決済み] SQLのSELECTでIF...THENを実行するにはどうすればよいですか?
-
[解決済み] Oracleの全テーブルのリストを取得しますか?
-
[解決済み] JSON APIのレスポンス形式には規格がありますか?
-
[解決済み] 文字列の一部をUPDATEおよびREPLACEする。
-
[解決済み] SQL ServerでINSERT INTOとしてデータをエクスポートする
-
[解決済み] 別のテーブルに一致する項目がない行を選択するにはどうすればよいですか?
-
[解決済み】新しいPostgreSQL JSONデータ型内のフィールドを変更するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
解決策:java.sql.SQLException: ユーザー ''@'localhost'' (パスワード: YES を使用) のアクセスが拒否されました。
-
[解決済み] SQL Server FOR EACH ループ
-
[解決済み] SQLの結合形式 - 入れ子になった内側join
-
[解決済み] SQLのSELECTでIF...THENを実行するにはどうすればよいですか?
-
[解決済み] SQL Serverで、指定したテーブルを参照しているすべての外部キーを一覧表示するにはどうすればよいですか?
-
[解決済み] SQL Server における DateTime2 と DateTime の比較
-
[解決済み] PostgreSQLで一重引用符で囲まれたテキストを挿入する
-
[解決済み] SQLでランダムな行を要求する方法は?
-
[解決済み] 複数の列に対してSELECT DISTINCTする方法(またはできる方法)は?
-
[解決済み】新しいPostgreSQL JSONデータ型内のフィールドを使用してクエリを実行するにはどうすればよいですか?