1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SQLServerでJSONの操作をする

Last updated at Posted at 2024-08-01

最近業務でSQLServerのJSONデータを操作することがありましたので、備忘録代わりに残しておきます。

なお、構成や表記など見づらいかもしれませんが、
初投稿なのでご容赦ください。精進します。

参考にしたページは 参考ページ 参照

環境

Microsoft SQL Server 2022 - 16.0.1121.4
互換レベル160

使用テーブルの作成

CREATE TABLE emp_data (
    employee_id INT PRIMARY KEY,
    employee_data NVARCHAR(MAX) -- JSONデータを格納
);

--データ投入
INSERT INTO emp_data (employee_id, employee_data)
VALUES 
(1, N'{
    "name": "Taro",
    "age": 30,
    "skills": ["SQL", "C#", "Azure"],
    "address": {
        "city": "Osaka",
        "prefecture": "Osaka"
    }
}'),
(2, N'{
    "name": "Jiro",
    "age": 25,
    "skills": ["JavaScript", "HTML", "CSS"],
    "address": {
        "city": "Kobe",
        "prefecture": "Hyogo"
    }
}');

SQLServer2022ではJSON型の指定ができないので、NVARCHARを利用しています。
入るデータを厳密にJSONにしたいのであれば、CHECK制約で実現できます。

ALTER TABLE emp_data
ADD CONSTRAINT chk_employee_data CHECK (
        ISJSON(employee_data) = 1
    );

ISJSON : 文字列に有効な JSON が含まれているかどうかをテストします。

データ

employee_id employee_data
1 { "name": "Taro", "age": 30, "skills": ["SQL", "C#", "Azure"], "address": { "city": "Osaka", "prefecture": "Osaka" }}
2 { "name": "Jiro", "age": 25, "skills": ["JavaScript", "HTML", "CSS"], "address": { "city": "Kobe", "prefecture": "Hyogo" }}

JSONデータの追加

JSONデータの階層追加

既存のJSONデータに新しい階層構造を追加する例です。

階層の追加
--追加したい値を一度出して
DECLARE @json_employee_data NVARCHAR(MAX) =
    (SELECT employee_data FROM emp_data WHERE employee_id = 1);

-- contact を追加して
DECLARE @json_inserted NVARCHAR(MAX) =
    JSON_MODIFY(@json_employee_data,'append $.contact', JSON_QUERY('{"phone" : "080-1234-5678","email": "taro@example.foo" }')
);

--データ上書き
UPDATE emp_data
SET employee_data = @json_inserted
WHERE employee_id = 1;

JSON_MODIFYは文字列をプレーンテキストとして渡すため、
直接記載すると追加後の値にエスケープ文字(\)が入ってしまいます。

ダブルクォーテーションにエスケープ文字が入る例
UPDATE emp_data
SET employee_data = JSON_MODIFY(employee_data,
                                'append $.contact', 
                                '{"phone": "080-1234-5678",
                                  "email": "taro@example.com"}'
                    )
WHERE employee_id = 1;

JSONデータの配列への追加

既存の配列に新しい要素を追加する例です。

配列の追加
-- Skillに "Python" を追加
UPDATE emp_data
SET employee_data = JSON_MODIFY(employee_data, 'append $.skills', 'Python')
WHERE employee_id = 1;

JSONデータの更新

JSONデータの要素更新

配列内の特定の要素を更新する例です。

要素の更新
DECLARE @newSkill NVARCHAR(100) = 'TypeScript';

-- JavaScript → TypeScript に変更
UPDATE emp_data
SET employee_data = JSON_MODIFY(employee_data, '$.skills[0]', @newSkill)
WHERE employee_id = 2;

JSONデータの削除

JSONデータの階層削除

JSONデータ内の特定の階層を削除する例です。

階層の削除
UPDATE emp_data
SET employee_data = JSON_MODIFY(employee_data, '$.address', NULL)
WHERE employee_id = 1;

参考ページ

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?