JSON フィールドからのデータ抽出
JSON でデータを格納することは有用ですが、その中の個々のフィールドをクエリできる必要もあります。このステップでは、JSON_EXTRACT 関数と JSON_UNQUOTE を使用して、product_details 列から特定の値を抽出します。
JSON_EXTRACT 関数は、パス式を使用して JSON ドキュメントから値を選択できます。パスはドキュメントのルートを表す $ で始まります。
ラップトップの brand を抽出してみましょう。
SELECT JSON_EXTRACT(product_details, '$.brand') AS brand FROM products WHERE product_name = 'Laptop';
このクエリはブランドを返しますが、結果は二重引用符を含む JSON 文字列であることに注意してください。
+--------+
| brand |
+--------+
| "Dell" |
+--------+
1 row in set (0.00 sec)
よりクリーンな結果を得るには、JSON_EXTRACT と JSON_UNQUOTE を組み合わせて使用できます。この組み合わせは値を取得し、引用符を削除して、標準的な文字列を返します。
SELECT JSON_UNQUOTE(JSON_EXTRACT(product_details, '$.brand')) AS brand FROM products WHERE product_name = 'Laptop';
出力はプレーンテキストの Dell になります。
+-------+
| brand |
+-------+
| Dell |
+-------+
1 row in set (0.00 sec)
パス式を使用して、ネストされたオブジェクト内の値にアクセスすることもできます。specs オブジェクトから processor を取得するには、パス $.specs.processor を使用します。
SELECT JSON_UNQUOTE(JSON_EXTRACT(product_details, '$.specs.processor')) AS processor FROM products WHERE product_name = 'Laptop';
これにより、ネストされた値が正しく抽出されます。
+-----------------+
| processor |
+-----------------+
| Intel Core i7 |
+-----------------+
1 row in set (0.00 sec)
これらの関数は、行をフィルタリングするための WHERE 句でも役立ちます。価格が 1000 を超えるすべての製品を見つけるには、比較のために抽出された JSON 値を数値型に CAST する必要があります。
SELECT product_name, JSON_UNQUOTE(JSON_EXTRACT(product_details, '$.price')) AS price FROM products WHERE CAST(JSON_UNQUOTE(JSON_EXTRACT(product_details, '$.price')) AS SIGNED) > 1000;
このクエリは、JSON フィールド内の数値に基づいてレコードをフィルタリングする方法を示しています。
+--------------+-------+
| product_name | price |
+--------------+-------+
| Laptop | 1200 |
+--------------+-------+
1 row in set (0.00 sec)
これで、JSON フィールドに基づいてデータを抽出し、フィルタリングする方法がわかりました。