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

Cách trả lại các khóa trùng lặp từ tài liệu JSON trong SQL Server

Nếu bạn đang cố gắng trích xuất các giá trị từ tài liệu JSON, nhưng một hoặc nhiều giá trị ở cùng cấp có khóa trùng lặp, bạn có thể gặp sự cố nếu cố gắng trích xuất các giá trị đó bằng cách sử dụng JSON_QUERY() hoặc JSON_VALUE() .

Cả hai hàm đó sẽ chỉ trả về giá trị đầu tiên phù hợp với đường dẫn.

May mắn thay, có một lựa chọn khác.

OPENJSON() hàm sẽ trả về tất cả các giá trị từ bất kỳ khóa trùng lặp nào trên cùng một cấp.

Ví dụ

Đây là một ví dụ để chứng minh OPENJSON() trả về các thuộc tính trùng lặp ở cùng một cấp.

DECLARE @json NVARCHAR(4000) = N'{
    "dog" : {
            "details" : {
                "name" : "Fetch", 
                "name" : "Good Dog",
                "sex" : "male"
            }
        }
    }';
SELECT * FROM OPENJSON(@json, '$.dog.details');

Kết quả:

+-------+----------+--------+
| key   | value    | type   |
|-------+----------+--------|
| name  | Fetch    | 1      |
| name  | Good Dog | 1      |
| sex   | male     | 1      |
+-------+----------+--------+

Ví dụ này trả về tất cả các phần tử con của $.dog.details phím.

Trong trường hợp này, chúng ta có hai khóa có cùng tên ở cùng một cấp (name phím).

Nếu chúng tôi chỉ muốn trả về các giá trị từ hai name chìa khóa, chúng tôi có thể làm điều gì đó như sau.

DECLARE @json NVARCHAR(4000) = N'{
    "dog" : {
            "details" : {
                "name" : "Fetch", 
                "name" : "Good Dog",
                "sex" : "male"
            }
        }
    }';
SELECT value FROM OPENJSON(@json, '$.dog.details')
WHERE [key] = 'name';

Kết quả:

+----------+
| value    |
|----------|
| Fetch    |
| Good Dog |
+----------+

JSON_VALUE() &JSON_QUERY()

Như đã đề cập, cả JSON_VALUE()JSON_QUERY() chỉ trả về giá trị đầu tiên phù hợp với đường dẫn.

Vì vậy, nếu chúng tôi cố gắng sử dụng những thứ đó đối với tài liệu JSON ở trên, chúng tôi sẽ nhận được kết quả sau.

JSON_VALUE()

JSON_VALUE() trả về một giá trị vô hướng từ một chuỗi JSON, vì vậy nó sẽ trả về kết quả sau.

DECLARE @json NVARCHAR(4000) = N'{
    "dog" : {
            "details" : {
                "name" : "Fetch", 
                "name" : "Good Dog",
                "sex" : "male"
            }
        }
    }';
SELECT JSON_VALUE(@json, '$.dog.details.name') AS [JSON_VALUE];

Kết quả:

+--------------+
| JSON_VALUE   |
|--------------|
| Fetch        |
+--------------+

JSON_QUERY()

JSON_QUERY() trích xuất một đối tượng hoặc một mảng từ chuỗi JSON, vì vậy nó sẽ trả về kết quả sau.

DECLARE @json NVARCHAR(4000) = N'{
    "dog" : {
            "details" : {
                "name" : "Fetch", 
                "name" : "Good Dog",
                "sex" : "male"
            }
        }
    }';
SELECT JSON_QUERY(@json, '$.dog.details') AS [JSON_QUERY];

Kết quả:

+--------------+
| JSON_QUERY   |
|--------------|
| {
                "name" : "Fetch", 
                "name" : "Good Dog",
                "sex" : "male"
            }              |
+--------------+

Ít nhất với JSON_QUERY() chúng tôi có thể thấy các khóa trùng lặp, nhưng chúng tôi không nhận được các giá trị riêng lẻ của chúng như chúng tôi nhận được với OPENJSON() .


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Điểm của Danh mục ban đầu trong chuỗi kết nối SQL Server là gì?

  2. SQL Server 2005 Làm thế nào để tạo ra một ràng buộc duy nhất?

  3. Cách tạo Ràng buộc Duy nhất trên Cột cho Bảng đã tồn tại - Hướng dẫn SQL Server / TSQL Phần 97

  4. Làm cách nào để có thể tạm thời vô hiệu hóa các ràng buộc khóa ngoại bằng T-SQL?

  5. Tạo SQL Tạo tập lệnh cho các bảng hiện có với Truy vấn