部分列分组并将sql列值转换为JSON

时间:2019-12-30 11:23:24

标签: sql json sql-server

我有一个包含以下数据的sql表,

SqlTable:

---------------------------------------------------------------------
|PID                | LID   |Name               | Value             |
|-------------------|-------|-------------------|-------------------|
|73B                | CD    |Technolgy          | ELECTRICAL        |
|-------------------|-------|-------------------|-------------------|
|73B                | CD    |Source             | 100               |
|-------------------|-------|-------------------|-------------------|
|73B                | CD    | Estimation        | 50                |
|-------------------|-------|-------------------|-------------------|
|73B                | CD    |Capacity           | Full              |
|-------------------|-------|-------------------|-------------------|

我想通过将列PID和LID分组来从上表中选择数据,然后将Name和value列转换为JSON。

select语句的预期输出是

-------------------------------------------------------
|PID                | LID   |JSON                      |
|-------------------|-------|--------------------------|
|73B                | CD    |{"Technolgy":"ELECTRICAL",|
|                   |       |"Source":"100",           |
|                   |       |"Estimation" : "50",      |
|                   |       |"Capacity" : "Full" }     |
|-------------------|-------|--------------------------|

SQL Server或select语句查询选项中是否有内置函数?

2 个答案:

答案 0 :(得分:0)

一种可能的方法,但是如果使用SQL Server 2017+,则使用STRING_AGG()来构建JSON。对于早期版本,您需要使用FOR XML PATH进行字符串聚合。

表格:

CREATE TABLE Data (
   PID varchar(10),
   LID varchar(10),
   Name varchar(50),
   Value varchar(50)
)
INSERT INTO Data 
   (PID, LID, Name, Value) 
VALUES   
   ('73B', 'CD', 'Technolgy',  'ELECTRICAL'),
   ('73B', 'CD', 'Source',     '100'),
   ('73B', 'CD', 'Estimation', '50'),
   ('73B', 'CD', 'Capacity',   'Full')

带有STRING_AGG()的声明:

SELECT 
   PID, 
   LID, 
   CONCAT(
      '{',
      STRING_AGG(CONCAT('"', Name, '":"', Value, '"'), ','),
      '}'
   ) AS JSON 
FROM Data
GROUP BY PID, LID

带有FOR XML PATH的声明:

SELECT DISTINCT
   d.PID, 
   d.LID, 
   JSON = CONCAT(
      '{',
      STUFF(
         (
         SELECT CONCAT(',"', Name, '":"', Value, '"')
         FROM Data 
         WHERE PID = d.PID AND LID = d.LID
         FOR XML PATH('')
         ), 1, 1, N''
         ),   
      '}'
   )
FROM Data d

结果:

PID LID JSON
73B CD  {"Technolgy":"ELECTRICAL","Source":"100","Estimation":"50","Capacity":"Full"}

答案 1 :(得分:0)

一种选择是将值构造为字符串:

SELECT d.PID, d.LID, 
       CONCAT('{', STRING_AGG(CONCAT('"', Name, '":"',  Value, '"'), ', '), '}') as jsonstring
FROM Data d
GROUP BY d.PID, d.LID;

Here是db <>小提琴。