茫茫網海中的冷日 - 對這文章發表回應
茫茫網海中的冷日
         
茫茫網海中的冷日
發生過的事,不可能遺忘,只是想不起來而已!
 恭喜您是本站第 1671725 位訪客!  登入  | 註冊
主選單

Google 自訂搜尋

Goole 廣告

隨機相片
PIMG_00146.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

對這文章發表回應

發表限制: 非會員 可以發表

發表者: 冷日 發表時間: 2021/11/8 5:52:52

Hi,大家好,最近玩 T-SQL 用到了很特別的 OPENJSON 函式,以往處理 JSON 都會在前後端解決,想不到 SQL 能利用 OPENJSON 函式直接把 JSON 當成一個資料表來存取

NOTE

T-SQL OPENJSON 函式適用於 SQL Server 2016 以上

OPENJSON 預設輸出

OPENJSON 大多會搭配 WITH 子句來使用(稍後會使用到),如果不搭配 WITH,會傳回預設輸出

  1. key: 物件屬性名稱

  2. value: 值

  3. type: 類型

    • 0 -> null
    • 1 -> String
    • 2 -> Number
    • 3 -> Boolean
    • 4 -> Array
    • 5 -> Object

    類型是隨 JSON 值的型態不同而產生的數字,詳情可以看到 官方文檔 有對傳回值做詳細說明

使用 OPENJSON 剖析轉換 JSON

剖析 JSON 物件

sql


1
2
3
4
5
6
7
8
9
10
11
12

DECLARE @json VARCHAR(MAX) = '
{
"name": "horse",
"age": 18,
"isHandsome": true,
"nullValue": null,
"arrayValue": [1, 2, 3],
"objectValue": { "obj": "objString" }
}
';

SELECT * FROM OPENJSON(@json);

剖析 JSON 物件陣列

sql


1
2
3
4
5
6
7
8
9
10
11
12
13
14

DECLARE @json VARCHAR(MAX) = '
[
{
"name": "horse",
"age": 18
},
{
"name": "Otis",
"age": 18
}
]
';

SELECT * FROM OPENJSON(@json);

這種預設結構的顯示結果應該是或多或少會有需要用到的時候,不過筆者主要使用到的是下一種搭配 WITH 的用法,能夠帶有明確的結構,簡直就像是把 JSON 當作一張資料表來使用

有明確結構的 OPENJSON 輸出

使用 OPENJSON 函數的 WITH 子句指定結果的結構描述時,會傳回在 WITH 子句中所定義之資料行的資料表,逐一查看 JSON 物件陣列、讀取為每個資料行指定的值,並將值轉換成指定的型別

剖析物件陣列,搭配 WITH

sql


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

DECLARE @json VARCHAR(MAX) = '
[
{
"name": "horse",
"age": 18
},
{
"name": "Otis",
"age": 18
}
]
';

SELECT *
FROM OPENJSON(@json)
WITH (name VARCHAR(100) '$.name',
age INT '$.age')

可以看到他把陣列內的兩筆物件給按照 WITH 子句所寫的結構描述來呈現

總結

本篇只有帶出最簡易的 OPENJSON 用法,有時 JSON 結構可能會更複雜,那要處理時所寫的 SQL 程式就不只這樣,其實還有很多操作 JSON 的函式還沒有寫到

另外,在實務上,接到一包 JSON,後續通常是要用來做 INSERT 或 UPDATE 等等的 SQL 操作

這些就留待後續的文章補上

參考資料

  1. 使用 OPENJSON 剖析及轉換 JSON 資料 (SQL Server)

原文出處:T-SQL OPENJSON,想不到能直接用 SQL 來處理 JSON | 小馬彬的部落格
內容圖示
url email imgsrc image code quote
樣本
bold italic underline linethrough   












 [詳情...]
validation picture

注意事項:
預覽不需輸入認證碼,僅真正發送文章時才會檢查驗證碼。
認證碼有效期10分鐘,若輸入資料超過10分鐘,請您備份內容後,重新整理本頁並貼回您的內容,再輸入驗證碼送出。

選項

Powered by XOOPS 2.0 © 2001-2008 The XOOPS Project|