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

Cách đổi tên khóa JSON trong SQL Server (T-SQL)

Nếu bạn đang sử dụng JSON_MODIFY() chức năng sửa đổi tài liệu JSON trong SQL Server, bạn có thể quen với việc sửa đổi giá trị giá trị một phần của khóa / giá trị bất động sản. Nhưng bạn có biết rằng bạn cũng có thể sửa đổi khóa một phần?

Mẹo để thực hiện việc này là sao chép giá trị vào một khóa mới, sau đó xóa khóa cũ.

Ví dụ bên dưới.

Ví dụ cơ bản

Đây là một ví dụ cơ bản để cho thấy ý tôi muốn nói.

-- Declare a variable and assign some JSON to it
DECLARE @data NVARCHAR(50)='{"Name":"Homer"}'

-- Print the current JSON
PRINT @data

-- Rename the key (by copying the value to a new key, then deleting the old one)
SET @data=
 JSON_MODIFY(
  JSON_MODIFY(@data,'$.Handle', JSON_VALUE(@data,'$.Name')),
  '$.Name',
  NULL
 )
-- Print the new JSON
PRINT @data
mới

Kết quả:

{"Name":"Homer"}
{"Handle":"Homer"} 

Thao tác này sẽ in ra cặp khóa / giá trị ban đầu, theo sau là cặp khóa / giá trị mới.

Mặc dù có thể nói rằng chúng tôi đã “đổi tên” khóa, nhưng thực ra chúng tôi chỉ tạo một khóa mới, sao chép giá trị hiện có vào khóa mới đó, sau đó xóa khóa cũ bằng cách đặt nó thành NULL .

Trong trường hợp này, chúng tôi đã sử dụng JSON_VALUE() hàm để trích xuất giá trị.

Giá trị số

Bạn cần cẩn thận khi sao chép dữ liệu sang khóa mới. Theo mặc định, SQL Server sẽ đặt nó trong dấu ngoặc kép. Đây có thể là điều bạn muốn.

Tuy nhiên, nếu bạn đang sao chép một giá trị số, rất có thể bạn muốn nó vẫn là một giá trị số (tức là không có dấu ngoặc kép). Trong trường hợp này, bạn sẽ cần sử dụng CAST() hàm để ép kiểu dữ liệu số. Đây là một ví dụ:

-- Declare a variable and assign some JSON to it
DECLARE @data NVARCHAR(50)='{"Residents":768}'

-- Print the current JSON
PRINT @data

-- Rename the key (by copying the value to a new key, then deleting the old one)
SET @data=
 JSON_MODIFY(
  JSON_MODIFY(@data,'$.Population', CAST(JSON_VALUE(@data,'$.Residents') AS int)),
  '$.Residents',
  NULL
 )
-- Print the new JSON
PRINT @data
mới

Kết quả:

{"Residents":768}
{"Population":768} 

Vì vậy, giá trị kết quả là một số.

Nếu chúng tôi xóa CAST() từ ví dụ đó, chúng tôi kết thúc với điều này:

-- Declare a variable and assign some JSON to it
DECLARE @data NVARCHAR(50)='{"Residents": 768}'

-- Print the current JSON
PRINT @data

-- Rename the key (by copying the value to a new key, then deleting the old one)
SET @data=
 JSON_MODIFY(
  JSON_MODIFY(@data,'$.Population', JSON_VALUE(@data,'$.Residents')),
  '$.Residents',
  NULL
 )
-- Print the new JSON
PRINT @data
mới

Kết quả:

{"Residents": 768}
{"Population":"768"} 

Vì vậy, trong trường hợp này, chúng tôi không chỉ đổi tên khóa mà còn thay đổi kiểu dữ liệu (JSON) từ một số thành một chuỗi.

Lưu ý rằng JSON không phân biệt giữa các loại số khác nhau. Nó chỉ có một kiểu số:number.

Các phím có Dấu cách

Trong ví dụ này, tôi đổi tên khóa hiện có thành khóa mới có chứa khoảng trắng (nó bao gồm hai từ, được phân tách bằng dấu cách).

Vì khóa mới chứa một khoảng trắng nên tôi cần đặt khóa bằng dấu ngoặc kép. Nếu tôi không làm điều này, sẽ xảy ra lỗi.

-- Declare a variable and assign some JSON to it
DECLARE @data NVARCHAR(50)='{"Population":68}'

-- Print the current JSON
PRINT @data

-- Rename the key (by copying the value to a new key, then deleting the old one)
SET @data=
 JSON_MODIFY(
  JSON_MODIFY(@data,'$."Average IQ"', CAST(JSON_VALUE(@data,'$.Population') AS int)),
  '$.Population',
  NULL
 )
-- Print the new JSON
PRINT @data
mới

Kết quả:

{"Population":68}
{"Average IQ":68} 

Thuộc tính lồng nhau

Nếu thuộc tính được lồng vào nhau, không có vấn đề gì. Chỉ cần sử dụng ký hiệu dấu chấm để tham chiếu nó.

DECLARE @data NVARCHAR(4000)
SET @data=N'{  
    "Suspect": {    
       "Name": "Homer Simpson",  
       "Hobbies": ["Eating", "Sleeping", "Base Jumping"]  
    }
 }'
PRINT @data
SET @data=
  JSON_MODIFY(
    JSON_MODIFY(@data,'$.Suspect.Qualifications', JSON_QUERY(@data,'$.Suspect.Hobbies')),
   '$.Suspect.Hobbies',
   NULL
  )
PRINT @data

Kết quả:

	{ 
"Suspect": { 
"Name": "Homer Simpson", 
"Hobbies": ["Eating", "Sleeping", "Base Jumping"] 
}
}
{ 
"Suspect": { 
"Name": "Homer Simpson" 
,"Qualifications":["Eating", "Sleeping", "Base Jumping"]}
} 

Bạn cũng có thể nhận thấy rằng ví dụ này sử dụng JSON_QUERY() hàm để trích xuất giá trị, thay vì JSON_VALUE() giống như trong các ví dụ trước.

Điều này là do trong trường hợp này, chúng tôi đang trích xuất một mảng và JSON_VALUE() không thể trích xuất toàn bộ một mảng (nó chỉ có thể trích xuất một giá trị vô hướng từ mảng). JSON_QUERY() mặt khác, hàm trích xuất các đối tượng và mảng, nhưng không trích xuất các giá trị vô hướng.

Để đọc thêm về điều này, hãy xem JSON_QUERY() so với JSON_VALUE() :Sự khác biệt là gì?


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Phương thức Statement.setFetchSize (nSize) thực sự làm gì trong trình điều khiển JDBC của SQL Server?

  2. Chỉ nhận Tháng và Năm từ SQL DATE

  3. Tập lệnh khoảng không quảng cáo thu thập SQL Server -3

  4. Visual Studio:ContextSwitchDeadlock

  5. Tìm kiếm mờ SQL Server với Phần trăm so khớp