Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

JSON_VALUE () Ví dụ trong SQL Server (T-SQL)

Khi sử dụng JSON với SQL Server, bạn có thể sử dụng JSON_VALUE() hàm để trả về một giá trị vô hướng từ một chuỗi JSON.

Để sử dụng hàm này, bạn cung cấp hai đối số; biểu thức JSON và thuộc tính cần trích xuất.

Cú pháp

Cú pháp như sau:

JSON_VALUE ( expression , path )

Ở đâu expression là biểu thức chuỗi JSON và path là thuộc tính bạn muốn trích xuất từ ​​biểu thức đó.

Đối số đường dẫn có thể bao gồm một chế độ đường dẫn tùy chọn thành phần. Chế độ đường dẫn tùy chọn này có thể là một giá trị của lax hoặc strict . Giá trị này, nếu có, đứng trước ký hiệu đô la.

Ví dụ 1 - Cách sử dụng cơ bản

Dưới đây là một ví dụ để chứng minh cách sử dụng cơ bản của JSON_VALUE() chức năng.

SELECT JSON_VALUE('{"Name": "Bruce"}', '$.Name') AS 'Result';

Kết quả:

+----------+
| Result   |
|----------|
| Bruce    |
+----------+

Trong ví dụ này:

  • {"Name": "Bruce"} đối số là biểu thức JSON (một biểu thức nhỏ, nhưng vẫn là biểu thức JSON hợp lệ). Biểu thức JSON bao gồm một cặp khóa / giá trị. Trong trường hợp này, Name là chìa khóa, Bruce là giá trị của nó.
  • $.Name đối số là con đường. Đường dẫn này tham chiếu đến giá trị của Name khóa của biểu thức JSON. Vì vậy, chúng tôi có thể trích xuất giá trị bằng cách tham chiếu đến tên của cặp.

Ví dụ 2 - Mảng

Để trích xuất một giá trị từ một mảng, hãy tham chiếu chỉ mục của nó trong dấu ngoặc vuông, theo sau là khóa có liên quan. Đây là một ví dụ:

/* 
CREATE THE ARRAY (and put into a variable called @data)
*/
DECLARE @data NVARCHAR(4000)
SET @data=N'{
    "Cities": [
        {
            "Name": "Kabul",
            "CountryCode": "AFG",
            "District": "Kabol",
            "Population": 1780000
        },
        {
            "Name": "Qandahar",
            "CountryCode": "AFG",
            "District": "Qandahar",
            "Population": 237500
        }
    ]
}'

/* 
QUERY THE ARRAY
*/
SELECT 
  JSON_VALUE(@data,'$.Cities[0].Name') AS 'Name',
  JSON_VALUE(@data,'$.Cities[0].CountryCode') AS 'Country Code',
  JSON_VALUE(@data,'$.Cities[0].District') AS 'District',
  JSON_VALUE(@data,'$.Cities[0].Population') AS 'Population'

UNION ALL

SELECT 
  JSON_VALUE(@data,'$.Cities[1].Name') AS 'Name',
  JSON_VALUE(@data,'$.Cities[1].CountryCode') AS 'Country Code',
  JSON_VALUE(@data,'$.Cities[1].District') AS 'District',
  JSON_VALUE(@data,'$.Cities[1].Population') AS 'Population';  

Kết quả:

+----------+----------------+------------+--------------+
| Name     | Country Code   | District   | Population   |
|----------+----------------+------------+--------------|
| Kabul    | AFG            | Kabol      | 1780000      |
| Qandahar | AFG            | Qandahar   | 237500       |
+----------+----------------+------------+--------------+

Vì vậy, trong ví dụ này, chúng tôi tạo một mảng JSON và đặt nó vào một biến có tên là @data . Sau đó, chúng tôi chạy một truy vấn, sử dụng @data là đối số đầu tiên của JSON_VALUE() hàm (điều này là do @data chứa biểu thức JSON).

Mảng sử dụng cách đánh số dựa trên 0, vì vậy để trích xuất mục đầu tiên, chúng ta cần sử dụng Cities[0] , cái thứ hai Cities[1] , và như vậy.

Ví dụ 3 - Ví dụ về Cơ sở dữ liệu

Nếu chúng ta đặt dữ liệu từ ví dụ trước vào cơ sở dữ liệu, chúng ta có thể viết lại truy vấn như sau:

SELECT 
  JSON_VALUE(Document,'$.Cities[0].Name') AS 'Name',
  JSON_VALUE(Document,'$.Cities[0].CountryCode') AS 'Country Code',
  JSON_VALUE(Document,'$.Cities[0].District') AS 'District',
  JSON_VALUE(Document,'$.Cities[0].Population') AS 'Population'
FROM Json_Documents

UNION ALL

SELECT 
  JSON_VALUE(Document,'$.Cities[1].Name') AS 'Name',
  JSON_VALUE(Document,'$.Cities[1].CountryCode') AS 'Country Code',
  JSON_VALUE(Document,'$.Cities[1].District') AS 'District',
  JSON_VALUE(Document,'$.Cities[1].Population') AS 'Population'
FROM Json_Documents

Kết quả:

+----------+----------------+------------+--------------+
| Name     | Country Code   | District   | Population   |
|----------+----------------+------------+--------------|
| Kabul    | AFG            | Kabol      | 1780000      |
| Qandahar | AFG            | Qandahar   | 237500       |
+----------+----------------+------------+--------------+

Điều này giả định rằng tài liệu JSON được lưu trữ trong một cột có tên là Document , nằm trong bảng có tên Json_Documents .

Ví dụ 4 - Chế độ Đường dẫn

Như đã đề cập, bạn cũng có tùy chọn chỉ định chế độ đường dẫn. Đây có thể là lax hoặc strict .

Giá trị của chế độ đường dẫn xác định điều gì sẽ xảy ra khi biểu thức đường dẫn có lỗi. Cụ thể:

  • Trong lỏng lẻo , hàm trả về các giá trị trống nếu biểu thức đường dẫn có lỗi. Ví dụ:nếu bạn yêu cầu giá trị $ .name và văn bản JSON không chứa tên , hàm trả về null, nhưng không tạo ra lỗi.
  • Trong nghiêm ngặt , hàm phát sinh lỗi nếu biểu thức đường dẫn có lỗi.

Giá trị mặc định là lax .

Dưới đây là một ví dụ để chứng minh sự khác biệt giữa hai chế độ này.

Lỗi ở chế độ lỏng lẻo

Đây là những gì sẽ xảy ra khi biểu thức đường dẫn có lỗi khi ở chế độ lỏng lẻo.

SELECT JSON_VALUE('{"Name": "Bruce"}', 'lax $.Hobbies') AS 'Result';

Kết quả:

+----------+
| Result   |
|----------|
| NULL     |
+----------+

Trong ví dụ này, chúng tôi đang cố gắng tham chiếu đến Hobbies , nhưng khóa đó không tồn tại trong tài liệu JSON. Trong trường hợp này, chúng tôi nhận được giá trị null (vì chúng tôi đang sử dụng chế độ lỏng lẻo).

Lỗi ở chế độ nghiêm ngặt

Đây là những gì sẽ xảy ra khi chúng tôi chạy cùng một mã ở chế độ nghiêm ngặt.

SELECT JSON_VALUE('{"Name": "Bruce"}', 'strict $.Hobbies') AS 'Result';

Kết quả:

Msg 13608, Level 16, State 1, Line 1
Property cannot be found on the specified JSON path.

Như mong đợi, chế độ nghiêm ngặt dẫn đến thông báo lỗi được hiển thị.

Ví dụ 5 - Trả về các đối tượng và mảng

JSON_VALUE() hàm không trả về các đối tượng và mảng. Nếu bạn muốn trả về một đối tượng hoặc một mảng, hãy sử dụng JSON_QUERY() chức năng thay thế. Đây là một ví dụ mà tôi sử dụng cả hai hàm trong một truy vấn.

DECLARE @data NVARCHAR(4000)
SET @data=N'{  
    "Suspect": {    
       "Name": "Homer Simpson",  
       "Address": {    
         "City": "Mae Sai",  
         "Province": "Chiang Rai",  
         "Country": "Thailand"  
       },  
       "Hobbies": ["Eating", "Sleeping", "Base Jumping"]  
    }
 }'
 SELECT 
   JSON_VALUE(@data,'$.Suspect.Name') AS 'Name',
   JSON_VALUE(@data,'$.Suspect.Address.Country') AS 'Country',
   JSON_QUERY(@data,'$.Suspect.Hobbies') AS 'Hobbies',
   JSON_VALUE(@data,'$.Suspect.Hobbies[2]') AS 'Last Hobby';

Kết quả:

+---------------+-----------+----------------------------------------+--------------+
| Name          | Country   | Hobbies                                | Last Hobby   |
|---------------+-----------+----------------------------------------+--------------|
| Homer Simpson | Thailand  | ["Eating", "Sleeping", "Base Jumping"] | Base Jumping |
+---------------+-----------+----------------------------------------+--------------+

Trong trường hợp này, tôi sử dụng JSON_VALUE() để trả về các giá trị vô hướng khác nhau và JSON_QUERY() để trả về một mảng.

Vì vậy, nếu bạn cần trả về một đối tượng hoặc một mảng (bao gồm toàn bộ tài liệu JSON), hãy xem JSON_QUERY() Ví dụ trong SQL Server.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chuỗi định dạng ngày / giờ tùy chỉnh được hỗ trợ bởi FORMAT () trong SQL Server

  2. Nhật ký giao dịch SQL Server - Phần 2

  3. Cách lấy thông tin thống kê của máy chủ SQL bằng chức năng thống kê hệ thống

  4. Cách nhận các giá trị Tối đa và Tối thiểu từ một Bảng bằng cách sử dụng Hàm Tổng hợp - Hướng dẫn SQL Server / TSQL Phần 129

  5. Trả về thông tin phiên bản hệ điều hành trong SQL Server bằng Chế độ xem quản lý động sys.dm_os_host_info