DB

SQL ServerでJSON文字列を別行に分割してみた

SQL ServerでJSON文字列を含むカラムがある場合、ISJSON関数でJSON文字列かどうか判断でき、OPENJSON関数でJSON文字列を行分割することができる。

今回は、ISJSON関数やOPENJSON関数でJSON文字列を別行に分割してみたので、その手順を共有する。

前提条件

下記記事の「前提条件」の内容が完了していること。

Spring BootでSQL Serverに接続しMyBatisを利用してみた今回は、Spring Bootアプリケーションで接続するデータベースをSQL Serverに変更してみたので、そのサンプルプログラムを共...

JSON文字列の行分割操作

JSON文字列の行分割操作を行った結果は、以下の通り。

1) 以下のデータがある状態からスタートする。

SELECT * FROM user_data ORDER BY id ASC
JSON文字列の行分割操作_1

なお、都道府県コードは、以下のサイトに記載の値と同じにしている。
https://webuip.nii.ac.jp/webuip/ill-map-jis.html

2) 以下のように、ISJSON関数の戻り値=1であるレコードを取得すると、memoがJSON文字列であるデータのみを抽出できる。

SELECT * FROM user_data
WHERE ISJSON(memo) = 1
ORDER BY id ASC
JSON文字列の行分割操作_2 エンジニアファーストバナー

3) 以下のように、OPENJSON関数を利用すると、memoのJSON文字列(code, name)毎に別行に分割することができる。

SELECT u.id, u.name, memo_json.code, memo_json.name
FROM user_data u
CROSS APPLY OPENJSON(u.memo) WITH (
     code VARCHAR(2)
   , name NVARCHAR(10)
) memo_json
WHERE ISJSON(u.memo) = 1
JSON文字列の行分割操作_3

4) 以下のように、3)で抽出された結果に抽出条件を、WHERE句に追加することもできる。

SELECT u.id, u.name, memo_json.code, memo_json.name
FROM user_data u
CROSS APPLY OPENJSON(u.memo) WITH (
     code VARCHAR(2)
   , name NVARCHAR(10)
) memo_json
WHERE ISJSON(u.memo) = 1
AND memo_json.name = '東京'
JSON文字列の行分割操作_4

要点まとめ

  • SQL ServerでJSON文字列を含むカラムがある場合、ISJSON関数でJSON文字列かどうか判断でき、OPENJSON関数でJSON文字列を行分割することができる。