我正在使用SQL Server2016。有问题的列包含JSON。它始终以以下格式存储数据;
{“ question1”:“ 123”,“ question2”:“ 123”,“ reference-id”:“ Z6SIPLGKE56”}
因此,多行将具有相同的结构,但值不同。
有没有一种方法可以将其检索为表格?或放入临时表中?所以最终输出将是这样;
question1 | question2 | reference-id|....
123 | 123 | Z6SIPLGKE56
456 | 456 | Z6SWFLGKE56
我正在查看的最终结果是将结果导出到CSV。我可以在SQL Server外部执行此操作,但想知道是否可以使用SQL Server的内置功能(通过当前搜索,似乎可以使用诸如openjson等可用功能。.不允许您执行此操作一口气)。
更新1-由于注释需要更多详细信息
这是一个调查应用程序。因此,用户可以设计自己的调查。该结构存储为json。首先,让我们假设每个调查都有相同的问题集。 (例如:-调查1有5个问题,而调查2有10个问题)
现在,假设有两个用户填写了调查1。如果在json中可视化,示例数据如下:
来自用户1:
{“ forms-survey-client-reference-id”:“ RYRT4ZU1ZO”,“ question1”:“ ans1”,“ question2”:“ ans2” ....}
来自用户2
{“ forms-survey-client-reference-id”:“ RYRT4ZU1FE”,“ question1”:“ asdf”,“ question2”:“ dfhdsf” ....}
因此,此调查的CSV输出必须为:(忽略列顺序)
question1 | question2 | reference-id|....
asdf | dfhdsf | RYRT4ZU1FE
ans1 | ans2 | RYRT4ZU1ZO
现在考虑在从以下位置提交数据之后,调查2具有以下结构:
用户1
{“ forms-survey-client-reference-id”:“ RYRT4ZU1ZO”,“ question1”:“ ans1”,“ question2”:“ opt1,opt2,opt3” ....}
用户2
{“ forms-survey-client-reference-id”:“ RYRT4ABCZO”,“ question1”:“ ans1”,“ question2”:“ opt1,opt2” ....}
关于问题2的通知,用户选择了多个答案(复选框),并以逗号分隔的常规字符串形式存储(用户1选择了3个项目,用户2选择了2个项目)
以上的CSV输出应为:
question1 | question2 | reference-id|....
ans1 | opt1,opt2 | RYRT4ZU1ZO
ans1 | opt1,opt2,opt3 | RYRT4ABCZO
答案 0 :(得分:0)
假设这是您的JSON结构,则可以使用以下
DECLARE @json NVARCHAR(4000) = '{"question1":"123","question2":"123","reference-id":"Z6SIPLGKE56"}'
SELECT *
FROM
(
SELECT [key] JsonKey , value JsonValue
FROM OPENJSON (@json)
) X
PIVOT
(
MAX(JsonValue) FOR JsonKey IN ([question1], [question2], [reference-id])
) P
如果结构不相似,则需要创建动态透视图
您也可以这样做:
DECLARE @json NVARCHAR(4000) = '{"question1":"123","question2":"123","reference-id":"Z6SIPLGKE56"}'
SELECT *
FROM OPENJSON (@json)
WITH ([question1] INT '$."question1"',
[question2] INT '$."question2"',
[reference-id] varchar(100) '$."reference-id"')
答案 1 :(得分:0)
一种方法是使用OPENJSON
和CROSS APPLY
:
DECLARE @JsonTable TABLE(json nvarchar(MAX));
INSERT INTO @JsonTable VALUES
(N'{"question1":"123","question2":"123","reference-id":"Z6SIPLGKE56"}')
, (N'{"question1":"456","question2":"456","reference-id":"Z6SIPLGKE57"}');
SELECT
question1
, question1
, reference_id
FROM @JsonTable
CROSS APPLY OPENJSON(json)
WITH (
question1 int '$.question1'
, question2 int '$.question2'
, reference_id varchar(20) '$."reference-id"'
);