将OPENJSON应用于单个列

时间:2017-02-10 01:11:52

标签: sql-server json tsql

我有一个带有两个属性列的产品表和一个json列。我希望能够分隔json列并插入保留属性的额外行。示例数据如下所示:

ID          Name          Attributes
1           Nikon        {"4e7a":["jpg","bmp","nef"],"604e":["en"]}
2           Canon        {"4e7a":["jpg","bmp"],"604e":["en","jp","de"]}
3           Olympus      {"902c":["yes"], "4e7a":["jpg","bmp"]}

我知道OPENJSON可以将JSON对象转换为行,将键值转换为单元格但是如何将它应用于包含JSON数据的单个列?

我的目标是输出如下:

ID          Name          key        value
1           Nikon         902c       NULL
1           Nikon         4e7a       ["jpg","bmp","nef"]
1           Nikon         604e       ["en"]
2           Canon         902c       NULL
2           Canon         4e7a       ["jpg","bmp"]
2           Canon         604e       ["en","jp","de"]
3           Olympus       902c       ["yes"]
3           Olympus       4e7a       ["jpg","bmp"]
3           Olympus       604e       NULL

有没有办法可以查询这个产品表?或者有没有办法重现我的目标数据集?

SELECT
  ID,
  Name,
  OPENJSON(Attributes)
FROM products

谢谢!

1 个答案:

答案 0 :(得分:12)

这至少会让你朝着正确的方向前进。

SELECT P.ID, P.[Name], AttsData.[key], AttsData.[Value]
FROM products P CROSS APPLY OPENJSON (P.Attributes) AS AttsData

我现在卡住了一件事就是缺少值(结果中的值为null)......

我在考虑可能会做某种外部/完全联接回到这一点,但即使这样也让我感到头痛。你确定你需要吗?或者,您可以使用上面的SQL输出进行存在检查吗?

我会继续这样做。如果我找到一个与您的输出完全匹配的解决方案,我将添加此答案。

直到那时......祝你好运!