我有一个包含以下数据的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语句查询选项中是否有内置函数?
答案 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 <>小提琴。