[解決済み] PostgresのJSON配列に文字列が含まれているかどうかをチェックする
2022-04-20 17:19:31
質問
ウサギの情報を保存するためのテーブルがあります。それは以下のようなものです。
create table rabbits (rabbit_id bigserial primary key, info json not null);
insert into rabbits (info) values
('{"name":"Henry", "food":["lettuce","carrots"]}'),
('{"name":"Herald","food":["carrots","zucchini"]}'),
('{"name":"Helen", "food":["lettuce","cheese"]}');
ニンジン好きなウサギはどうやって探せばいいのでしょうか?私はこれを思いつきました。
select info->>'name' from rabbits where exists (
select 1 from json_array_elements(info->'food') as food
where food::text = '"carrots"'
);
そのクエリーは好きではありません。ごちゃごちゃしている。
フルタイムのウサギ飼いとして、データベース・スキーマを変更する時間はありません。ただ、ウサギにきちんと餌をやりたいだけなのです。もっと読みやすいクエリのやり方はないのでしょうか?
どのように解決するのですか?
PostgreSQL 9.4 からは
?
演算子
:
select info->>'name' from rabbits where (info->'food')::jsonb ? 'carrots';
をインデックス化することもできます。
?
クエリを
"food"
キーに切り替えた場合
jsonb
タイプに変更します。
alter table rabbits alter info type jsonb using info::jsonb;
create index on rabbits using gin ((info->'food'));
select info->>'name' from rabbits where info->'food' ? 'carrots';
もちろん、フルタイムのウサギ飼いとしてそんな時間はないでしょうけど。
更新してください。 1,000,000羽のウサギのテーブルで、各ウサギが2つの食べ物を好み、そのうち10%がニンジンを好むという設定で、パフォーマンスの向上を実証しています。
d=# -- Postgres 9.3 solution
d=# explain analyze select info->>'name' from rabbits where exists (
d(# select 1 from json_array_elements(info->'food') as food
d(# where food::text = '"carrots"'
d(# );
Execution time: 3084.927 ms
d=# -- Postgres 9.4+ solution
d=# explain analyze select info->'name' from rabbits where (info->'food')::jsonb ? 'carrots';
Execution time: 1255.501 ms
d=# alter table rabbits alter info type jsonb using info::jsonb;
d=# explain analyze select info->'name' from rabbits where info->'food' ? 'carrots';
Execution time: 465.919 ms
d=# create index on rabbits using gin ((info->'food'));
d=# explain analyze select info->'name' from rabbits where info->'food' ? 'carrots';
Execution time: 256.478 ms
関連
-
[解決済み] 正しいJSONコンテンツタイプは何ですか?
-
[解決済み] JSONでコメントを使用することはできますか?
-
[解決済み] なぜGoogleはJSONレスポンスにwhile(1);を前置するのでしょうか?
-
[解決済み] cURLでJSONデータをPOSTするにはどうすればよいですか?
-
[解決済み] JavaScriptでJSONをきれいに印刷する
-
[解決済み] Microsoft JSONの日付はどのようにフォーマットするのですか?
-
[解決済み] JSON文字列を安全にオブジェクトに変換する
-
[解決済み] JSオブジェクトをJSON文字列に変換する
-
[解決済み] Node.js プロジェクトの package.json ファイルを自動的にビルドする方法はありますか?
-
[解決済み] Scalaの標準クラスを使ってScalaで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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Kubernetes / kubectl - 「コンテナ名を指定する必要があります」とありますが、そのような感じですか?
-
[解決済み] Elasticsearchでネストしたオブジェクトを検索する方法
-
[解決済み] マニフェスト 行: 1, 列: 1, 構文エラー
-
[解決済み] kubectl get pods の json フォーマットの出力を jsonpath でパースする方法
-
[解決済み] node.jsでJSONをpretty-printするにはどうしたらいいですか?
-
[解決済み] JSONの二重引用符をエスケープする方法
-
[解決済み] JSON、REST、SOAP、WSDL、そしてSOA。これらはどのように結びついているのか
-
[解決済み] SwiftでJSON辞書の型を持つプロパティをデコードする方法 [45] デコード可能なプロトコル
-
[解決済み] jsonパラメータを含むCurl GETリクエスト
-
[解決済み] PostgresでJSONフィールドにインデックスを作成するには?