Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
【PostgreSQL】JSON データ絞り込み入門 / Introduction to Fi...
Search
Tomotaka Shimizu
February 17, 2025
Programming
46
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
【PostgreSQL】JSON データ絞り込み入門 / Introduction to Filtering JSON Data in PostgreSQL
めぐろLT #24 「データベース」で LT した際に使用した発表スライドです。
https://meguro-lt.connpass.com/event/343511/
Tomotaka Shimizu
February 17, 2025
Other Decks in Programming
See All in Programming
JAWS-UG 東京支部が始める、JAWS-UG支部コラボ / JAWS-UG lunchtime LT Collaboration
y0hgi
0
280
カツオ、ご期待ください
suneo3476
0
190
Agents on Rails - Rails at Scale 2026
irinanazarova
0
560
コーディング自動化の次へ。人の介入をゼロにするファクトリーとサポートAIによる実践
timakin
5
3.8k
PumaからFalconに移行したRailsアプリケーションでの実践
falcon8823
0
170
作って学ぶSpring BootのAuto Configuration / JJUG Night Seminar 2026-10-19
rshindo
0
160
Event is what happens
moro
2
850
すこし踏み込む CancellationToken
htkym
2
1.7k
contenteditable と日本語入力に向き合う
colorful12
0
200
Rでドレミ/Do-Re-Mi_with_R
florets1
0
130
S3 TablesのIcebergデータに、AIエージェントからアクセスしてみた / 20261016developersio2026joetsu-accessing-iceberg-in-s3tables-via-agent
kasacchiful
PRO
0
160
AmebaブログはKMPから卒業します
kmars0605
0
200
Featured
See All Featured
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Utilizing Notion as your number one productivity tool
mfonobong
4
620
Building the Perfect Custom Keyboard
takai
2
910
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
630
How GitHub (no longer) Works
holman
316
150k
Un-Boring Meetings
codingconduct
0
460
Faster Mobile Websites
deanohume
310
32k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
203
77k
The SEO identity crisis: Don't let AI make you average
varn
0
590
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Tell your own story through comics
letsgokoyo
1
1.1k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
540
Transcript
【PostgreSQL】 JSON データ絞り込み入門 〜JSON と JSONB の違い&便利な演算子をマスターしよう〜 2025/02/17 #めぐろLT 株式会社HRBrain
清水智貴
2 AGENDA • 自己紹介 • 概要・背景 • JSON vs JSONB
• クエリの具体例 • 演算子まとめ • まとめ
自己紹介
4 自己紹介 • 清水 智貴 • 人事評価サービスの開発 • バックエンドエンジニア •
東京都 出身 • 最近の趣味 ◦ Podcast聴く ◦ 散歩 • 今回が初のLT!
概要・背景
6 何を伝えたいか • JSON データでも SQL で絞り込み可能 ◦ PostgreSQL に
JSON で保存されていても、演算子を使えば柔軟な検索ができる ◦ 具体例で紹介します
7 JSON データの絞り込み方法を調べた背景 • 廃止された機能のデータが JSON に潜んでいる…? ◦ 過去に開発された機能が廃止され、DB にそのレコードが残っているかもしれない
◦ JSON カラム内に保存されていて、リレーショナルなカラムではない ◦ PostgreSQL での JSON の検索方法を調べることに!
8 JSON データの絞り込み方法を調べた背景 • 廃止された機能のデータが JSON に潜んでいる…? ◦ 過去に開発された機能が廃止され、DB にそのレコードが残っているかもしれない
◦ JSON カラム内に保存されていて、リレーショナルなカラムではない ◦ PostgreSQL での JSON の検索方法を調べることに! • この発表で言及しないこと ◦ 設計論(正規化すべきか等)は対象外 ◦ 今回は 「既に JSON で保存されている」 ことが前提 ◦ JSON でデータ保存することの是非や、 正規化との比較は別途検討が必要だが、今回は扱わない
JSON と JSONB
10 JSON vs JSONB • PostgreSQL の JSON には2種類の型がある •
JSON型 ◦ テキストをそのまま保持するため、空白や改行、キーの順序などを厳密に保ちたい場合に有用 ◦ クエリ内での検索には不向き • JSONB型 ◦ バイナリ形式で保持するため、検索・集計・更新が高速 ◦ 演算子が豊富でインデックスも可能 • 使い分け ◦ JSON: 保管用途やオリジナルのテキストを保ちたいデータ ◦ JSONB: 頻繁に検索や更新を行いたいデータ
11 JSON vs JSONB • PostgreSQL の JSON には2種類の型がある •
JSON型 ◦ テキストをそのまま保持するため、空白や改行、キーの順序などを厳密に保ちたい場合に有用 ◦ クエリ内での検索には不向き • JSONB型 ◦ バイナリ形式で保持するため、検索・集計・更新が高速 ◦ 演算子が豊富でインデックスも可能 • 使い分け ◦ JSON: 保管用途やオリジナルのテキストを保ちたいデータ ◦ JSONB: 頻繁に検索や更新を行いたいデータ 今日は JSONB 型を用いて具体例を紹介します!
クエリの具体例
13 クエリの具体例 • テーブル構造 • data カラムに、ユーザー情報が JSON 形式で保存されている ◦
name ◦ age ◦ skills ◦ location CREATE TABLE sample_table ( id SERIAL PRIMARY KEY, data JSONB ); INSERT INTO sample_table (data) VALUES ('{"name": "Alice", "age": 25, "skills": ["Python", "SQL"], "location": {"city": "Tokyo"}}'), ('{"name": "Bob", "age": 30, "skills": ["Java", "JavaScript"], "location": {"city": "Osaka"}}'), ('{"name": "Charlie", "age": 35, "skills": ["Python", "Go"], "location": {"city": "Fukuoka"}}');
14 例1)特定のキーの値を条件に絞り込む • JSONデータ • name が "Alice" のレコードを取得 ◦
->>: JSONB から指定したキーの値を文字列として取得する演算子 • 結果 INSERT INTO sample_table (data) VALUES ('{"name": "Alice", "age": 25, "skills": ["Python", "SQL"], "location": {"city": "Tokyo"}}'), ('{"name": "Bob", "age": 30, "skills": ["Java", "JavaScript"], "location": {"city": "Osaka"}}'), ('{"name": "Charlie", "age": 35, "skills": ["Python", "Go"], "location": {"city": "Fukuoka"}}'); SELECT * FROM sample_table WHERE data ->> 'name' = 'Alice'; id data 1 {"name": "Alice", "age": 25, "skills": ["Python", "SQL"], "location": {"city": "Tokyo"}}
15 例2)数値の条件で絞り込む • JSONデータ • age が 30 より大きいレコードを取得 ◦
(data ->> 'age')::int: JSONB から取得した値を数値型にキャスト • 結果 INSERT INTO sample_table (data) VALUES ('{"name": "Alice", "age": 25, "skills": ["Python", "SQL"], "location": {"city": "Tokyo"}}'), ('{"name": "Bob", "age": 30, "skills": ["Java", "JavaScript"], "location": {"city": "Osaka"}}'), ('{"name": "Charlie", "age": 35, "skills": ["Python", "Go"], "location": {"city": "Fukuoka"}}'); SELECT * FROM sample_table WHERE (data ->> 'age')::int > 30; id data 3 {"name": "Charlie", "age": 35, "skills": ["Python", "Go"], "location": {"city": "Fukuoka"}}
16 例3)配列の要素を条件に絞り込む • JSONデータ • skills 配列に "Python" が含まれるレコードを取得 ◦
?: JSONB 配列に特定の値が含まれているかを判定する演算子 • 結果 INSERT INTO sample_table (data) VALUES ('{"name": "Alice", "age": 25, "skills": ["Python", "SQL"], "location": {"city": "Tokyo"}}'), ('{"name": "Bob", "age": 30, "skills": ["Java", "JavaScript"], "location": {"city": "Osaka"}}'), ('{"name": "Charlie", "age": 35, "skills": ["Python", "Go"], "location": {"city": "Fukuoka"}}'); SELECT * FROM sample_table WHERE data -> 'skills' ? 'Python'; id data 1 {"name": "Alice", "age": 25, "skills": ["Python", "SQL"], "location": {"city": "Tokyo"}} 3 {"name": "Charlie", "age": 35, "skills": ["Python", "Go"], "location": {"city": "Fukuoka"}}
演算子まとめ
18 JSON/JSONBの主な演算子 • 共通で使用可能な演算子 ◦ ->: JSON データから指定したキーの値を JSON 形式で取得
◦ ->>: JSON データから指定したキーの値を文字列として取得 ◦ #>: ネストされた JSON データから特定のキーを指定して値を JSON 形式で取得 ◦ #>>: ネストされた JSON データから特定のキーを指定して値を文字列形式で取得 • JSONB のみで使用可能な演算子 ◦ ?: JSONB オブジェクトや配列に指定したキーや値が存在するかを判定 ◦ @>: JSONB データが特定の構造を含むかどうかを判定 ◦ ?|: JSONB 配列内のいずれかの要素が指定した条件を満たすかを判定 ◦ &>: JSONB 配列が指定したすべての要素を含むかを判定
19 JSONB データのキャスト • 数値型へのキャスト ◦ ::integer: 整数型へのキャスト。小数点以下は切り捨て。 ◦ ::numeric:
任意精度の数値型へのキャスト。小数点以下の桁数を保持。 ◦ ::int: integer の別名。同じ動作。 • 日付型へのキャスト ◦ ::date: 日付のみを扱う型へのキャスト。例: '2024-01-21' ◦ ::timestamp: 日付と時刻を扱う型へのキャスト。例: '2024-01-21 13:45:30' ◦ ::timestamptz: タイムゾーン付きの日付と時刻を扱う型へのキャスト。例: '2024-01-21 13:45:30+09:00' • 真偽値へのキャスト ◦ ::boolean
まとめ
• 何を伝えたかったか ◦ JSON に入っているデータでも、PostgreSQL なら SQL で簡単に絞り込みできる • 背景
◦ 廃止された機能が DB の JSON に残っていないか確認が必要だったから • 内容 ◦ JSON 型と JSONB 型の違い ◦ クエリの具体例 ◦ 演算子 • 感想 ◦ JSONB を使うとスキーマ柔軟&複雑なクエリが可能 ◦ 問い合わせ対応での本番DB調査などに活躍するかも 21 まとめ
• PostgreSQL Documentation - JSON Types • PostgreSQL Documentation -
Index Types • 【PostgreSQL】JSON データを SQL クエリで絞り込みする方法 ◦ 私が投稿したQiita記事にもう少し詳細に書いています。 22 参考文献
ご清聴ありがとうございました!