1. 程式人生 > 其它 >SQL Server – Work with JSON

SQL Server – Work with JSON

前言

JSON 是一個很好的格式, array, object 就能表達一個表格了.

如果想儲存一些結構格式, 又不想用表格這麼大費周章的話, JSON 會是很好選擇.

比如我用它來記入 Audit Trial, 每一個請求的 post data 直接記入到一個 column 裡面.

SQL Server 是在 2016 版本開始支援 JSON 格式的.

之前寫過一些小筆記

主要參考

JSON data in SQL Server

Index JSON data

實戰

建立 JSON Column

CREATE TABLE TestJson
(
    Id int IDENTITY CONSTRAINT
PK_TestJson_Id PRIMARY KEY, JsonData nvarchar(max) CONSTRAINT [Content should be formatted as JSON] CHECK(ISJSON(JsonData)>0) );

Json Column 其實就是 nvarchar 來的, 只是在上面加了一層 constraint 而已. ISJSON 是一個判斷 text 是不是 JSON 的方法.

進資料

沒什麼特別的, 進 string 就可以了

INSERT INTO TestJson (JsonData) VALUES 
('{ "name": "Derrick", "age": 11, "good": true }
'), ('{ "name": "Keatkeat", "age": 12, "good": false }');

Query

SELECT 
JSON_VALUE(JsonData, '$.name')as [Name],
JSON_VALUE(JsonData, '$.age') as Age, 
CAST(JSON_VALUE(JsonData, '$.good') as bit) as Good, 
* FROM TestJson
WHERE JSON_VALUE(JsonData, '$.good') = 'true'
ORDER BY JSON_VALUE(JsonData, '
$.name');

通過 JSON_VALUE 這個方法就可以獲取到物件屬性值, 然後就可以當成普通 column 值來處理了.

注: boolean 被 parse 出來是 nvarchar 哦, 可以通過 cast 換成 bit. number parse 出來時 int, 這個是對的.

Update

UPDATE TestJson SET JsonData = JSON_MODIFY(JsonData, '$.age', 100);

通過 JSON_MODIFY 就可以修改 JSON 內容了, 它會返回一個 JSON string, 有一種immutable 的 feel...

如果要同時修改多個屬性值也非常簡單

UPDATE TestJson SET JsonData = JSON_MODIFY(JSON_MODIFY(JsonData, '$.age', 100), '$.good', 'false') ;

只要巢狀一下就可以了哦....

JSON Array

TODO...

JSON Index

JSON 要 filter, orderby 快的話, 做法是通過 computed column 或者是索引來優化.

具體看這篇, 我就不寫了.