MAGAZINE
ルーターマガジン
データベース
mysqlでJSONテキストから配列、オブジェクトなどの型名を取り出す
2026.03.06
皆さん、こんにちは。エンジニアのHatanoです。 業務において、データを集計する際に、「テキスト型のカラムにおいて、配列として処理できるテキストが入っていれば配列の各要素、処理できないテキストの場合はnullを取得したい」という場面がありました。 今回は、この集計を行うために必要な、「mysqlで、JSONテキストから型名を取り出す」方法について紹介します。
実行環境
以下の環境で実行及び動作確認を行っています。
MySQL [test]> SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 8.0.45 |
+-----------+
解説
テキストが配列かどうかを判定するには、JSON_TYPEメソッドを使います。 このメソッドは、引数のJSON値のデータ型を文字列として返します。返り値は、以下の種類があります。
ARRAY, OBJECT, BOOLEAN, DOUBLE, INTEGER, NULL, STRING
また、引数のデータがJSON値として処理できない場合は、引数がNULLならNULL値が返され、それ以外ならエラーが発生します。
以下のtestsテーブルを用いて、具体例を見ていきます。
CREATE TABLE tests
(
id int NOT NULL AUTO_INCREMENT,
target text,
PRIMARY KEY (id)
);
INSERT INTO tests (id,target) VALUES
(1,'[1, 2, {"key": "value"}]'),
(2,'{"key":"value"}'),
(3,'true'),
(4,'1.2'),
(5,'1'),
(6,'null'),
(7,'"a sample string"'),
(8,NULL),
(9,'["a","g!",[1,2],345,"test_sentence_3"]')
JSON_TYPEメソッドを用いることで、各レコードのデータ型を取得できます。
SELECT id,target,JSON_TYPE(target) as 'json_type' from tests;
+----+----------------------------------------+-----------+
| id | target | json_type |
+----+----------------------------------------+-----------+
| 1 | [1, 2, {"key": "value"}] | ARRAY |
| 2 | {"key":"value"} | OBJECT |
| 3 | true | BOOLEAN |
| 4 | 1.2 | DOUBLE |
| 5 | 1 | INTEGER |
| 6 | null | NULL |
| 7 | "a sample string" | STRING |
| 8 | NULL | NULL |
| 9 | ["a","g!",[1,2],345,"test_sentence_3"] | ARRAY |
+----+----------------------------------------+-----------+
json_typeにJSON値として認識できない引数を与えた場合、次のようなエラーとなります。
select json_type('ABC');
ERROR 3141 (22032): Invalid JSON text in argument 1 to function json_type: "Invalid value." at position 0.
なお、json_type('null')の返り値は'NULL'という文字列であり、引数がNULLの場合の返り値(NULL値)とは異なります。
select json_type('null') is NULL, json_type(NULL) is NULL;
+---------------------------+-------------------------+
| json_type('null') is NULL | json_type(NULL) is NULL |
+---------------------------+-------------------------+
| 0 | 1 |
+---------------------------+-------------------------+
使用例
json_typeをwhereで絞り込むことで、データ型での絞り込みが可能となります。
SELECT id,target,JSON_TYPE(target) as 'json_type' from tests where JSON_TYPE(target) = 'ARRAY';
+----+----------------------------------------+-----------+
| id | target | json_type |
+----+----------------------------------------+-----------+
| 1 | [1, 2, {"key": "value"}] | ARRAY |
| 9 | ["a","g!",[1,2],345,"test_sentence_3"] | ARRAY |
+----+----------------------------------------+-----------+
おわりに
様々な形式のテキストが同じカラムに挿入される場合、データ型の取得は必要不可欠です。mysqlを使っている方は、ぜひ試してみてください。
CONTACT
お問い合わせ・ご依頼はこちらから