SQLServer JSON列数据到临时表

时间:2018-06-27 12:13:47

标签: sql-server

我正在使用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

2 个答案:

答案 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)

一种方法是使用OPENJSONCROSS 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"'  
 );