Skip to main content

How to manipulate JSON data in SQL server?

Manipulate JSON data in SQL Server

JavaScript Object Notation (JSON) is a lightweight popular data exchangeable format used across modern IoT platforms, web and mobile applications etc. It is a language independent textual data format. JavaScript Object Notation (JSON) is also used for storing unstructured data in log files or NoSQL Databases such as Microsoft Azure Cosmos DB. Many RESTful web services that allow us to store and retrieve JSON formatted texts among different protocols using different Endpoints. The example of JSON text is as follows,
[{
        "customer":"Michael",
        "products":["Watch","Mobile","Books"]
},
{
        "customer":"Stuart",
        "products":["Laptop","Keyboard","Mouse"]
}]
In this article you will understand the following,

  • Read JSON data from table
  • Modify JSON data in a table
  • Validate JSON objects 
  • Convert array of JSON objects into table format

Lets see how to retrieve JSON data from a table?

Read JSON data from table

Here we are using JSON_VALUE predefined function to retrieve column values from JSON objects.
In this example, we are using country wise sales table to read customer and product list details.
SELECT Country, 
 JSON_VALUE(Data,'$.Customers.customer') AS Customer,
 JSON_VALUE(Data,'$.Customers.products') AS Products
FROM tbl_CountryWiseSales
The JSON_VALUE function used to extract an object or an array from a JSON string instead of a scalar value. In lax mode JSON_VALUE returns null, In strict mode JSON_VALUE returns an exception.










The JSON_VALUE function returns null when there is an nested array of objects like you can see in the above example, we are having customer array objects in this we are having nested multiple products list, when you see the return result you can see the NULL products because the JSON_VALUE function returns null when there is nested objects. In order to read this value we need to use JSON_QUERY function instead.
SELECT Country, 
JSON_VALUE(Data,'$.Customers.customer') AS Customer,
JSON_QUERY(Data,'$.Customers.products') AS Products
FROM tbl_CountryWiseSales
The JSON_QUERY is used to extract a scalar value from a JSON string instead of an object or an array.

Modify JSON data in a table

The JSON_MODIFY function is used to update the values of a property in JSON string and return the updated JSON string. The following example illustrates how to update a value of a property in a variable that contains JSON?.
update tbl_CountryWiseSales set Data=JSON_MODIFY(Data,'$.Customers.customer','Michael Raj')
where JSON_VALUE(Data,'$.Customers.customer')='Michael';
The updated JSON data should be like this,
In order to update the nested object values, your query should be like this,
update tbl_CountryWiseSales set Data=JSON_MODIFY(Data,'$.Customers.products[0]','Watch1')
where JSON_VALUE(Data,'$.Customers.customer')='Michael Raj';
The query returned result is,

Validate JSON data 

In order to validate JSON data we are using ISJSON() straightforward built-in function. The ISJSON() tests whether a string contains valid JSON or not. The following example returns rows in which the column "Data" contains valid JSON.
SELECT Country,Data
FROM tbl_CountryWiseSales
where ISJSON(Data)>0;
The returned result is,


Convert JSON objects into table format

The OPENJSON function is used to easily convert JSON data to rows and colmns. The OPENJSON provides a row set view over a JSON document. You can explicitly specify the columns in the row set and the JSON property paths used to populate the columns. With OPENJSON function you can easily import JSON files into SQL server or convert JSON data into table format. The following example returns a nested objects by specifying the path:
SELECT [Key],value
FROM tbl_CountryWiseSales  
CROSS APPLY OPENJSON (Data,'$.Customers.products') as p 
The returned result is,
By without specifying path, your query should be like this:
SELECT [Key],value
FROM tbl_CountryWiseSales  
CROSS APPLY OPENJSON (Data)
 The result is,
Suppose, If you want to read the top level object values the query should be:
SELECT Country,v.customer
FROM tbl_CountryWiseSales  
CROSS APPLY OPENJSON (Data) WITH (customer nvarchar(100) '$.Customers.customer') as v
The returned result is,
The OPENJSON uses key value pair to retrieve JSON data as well as it removes duplicate property values.



Comments

Popular posts from this blog

FORCE ORDER in SQL Server

The FORCE ORDER is a query hint it executes the order of the tables exactly specified in a statement. When we use this query hint in a statement it will tell SQL server not to change the order of the joins in the query. Basically, the SQL server rearrange your joins to be in the order that it thinks it will be optimal for your query to execute. Now, Lets see the execution plan without the FORCE ORDER: The above execution plan demonstrates the optimal order of the joins returned by the SQL server. As you can see the order starts from the sales details and goes by bank details to employee details. Suppose if you don't want the SQL server to change the order of the joins in a query you can use FORCE ORDER to stop the default ordering. The syntax for FORCE ORDER query hint is, OPTION ( FORCE ORDER ); Now, Lets see the execution plan with the FORCE ORDER: select * from tbl_EmployeeDetails as e inner join tbl_BankDetails as b on e.Id=b.EmpID inner join tbl_S...

How to create comma separated values in SQL server?

Comma Separated Values in SQL Predominantly in reporting, you may gone through a situation where you need to convert a comma separated values into list of rows or to convert a list of rows into single column to display in a report. In this splash reading, you will understand the following: How to convert comma separated data in a column to multiple rows How to convert multiple rows into one comma separated values Using COALESCE function Using STUFF function Convert comma separated data in a column to multiple rows Here we have an Customer table with a list of products bought by each customer, ID CUSTOMER PRODUCTS 1 Stuart Chain Saw,Circular Saw 2 Michael Drill,Hammer 3 Jonathan Sticky Notes,Mouse 4 Nabeel Mobile,Headset Suppose you want to return this as a single table, list of products bought by each customer. we need to create a function that splits our comma separated col...

OPTION (MERGE JOIN) in SQL Server

OPTION (MERGE JOIN) in SQL Server The MERGE JOIN query hint is a best available join algorithm in SQL server. It is based on first sorting  both data sets according to the join conditions and then traversing through the sorted data sets and finding matches. The MERGE JOIN itself is very fast, but it can be an expensive choice if sort operations are required. This produces the best optimal execution plan. The syntax is, OPTION ( MERGE JOIN ); Now, Lets see how to use MERGE JOIN with SELECT statement.? select * from tbl_EmployeeDetails as e inner join tbl_BankDetails as b on b.EmpId=e.Id OPTION(MERGE JOIN); The statement returned optimal execution plan is, The MERGE JOIN operator gets a row from each input and compares them. In above statement, it merges all joins and first sorting data sets and then traversing through the sorted data sets and finding matches, if they are equal the rows are returned. If they are not equal, the lower-value row is rem...

OPTION Loop Join in SQL Server

The OPTION ( LOOP JOIN ) would enforce LOOP JOIN across all joins in the query. Using the OPTION ( LOOP JOIN ) appears to allows the query optimizer to join the tables using the nested loops in which ever order SQL server decides it is optimal. The OPTION clause must be a last clause in a statement. The syntax is, OPTION ( LOOP JOIN ); Now, Lets see how to use LOOP JOIN with SELECT statement.? select *from tbl_EmployeeDetails as e inner join tbl_BankDetails as b on b.EmpID=e.Id inner join tbl_SalesDetails as s on s.BankId=b.Id OPTION(LOOP JOIN); The statement returned execution plan is, The above statement loops through all the joins that starts from sales details and goes by bank details to employee details in which the order that SQL server thinks it is optimal. This does not follow the order of joins that we specify. Suppose, if you want the SQL server to follow the order of joins that you specify you have to use FORCE ORDER in OPTION clause. Howe...