SQL Server – Work with JSON
阿新 • • 發佈:2021-10-20
前言
JSON 是一個很好的格式, array, object 就能表達一個表格了.
如果想儲存一些結構格式, 又不想用表格這麼大費周章的話, JSON 會是很好選擇.
比如我用它來記入 Audit Trial, 每一個請求的 post data 直接記入到一個 column 裡面.
SQL Server 是在 2016 版本開始支援 JSON 格式的.
之前寫過一些小筆記
主要參考
實戰
建立 JSON Column
CREATE TABLE TestJson ( Id int IDENTITY CONSTRAINTPK_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 或者是索引來優化.
具體看這篇, 我就不寫了.