1

我无法理解如何从单行中提取多个值,其中每一行的 JSON 数组中都有源。

设置可能有点傻,但就是这样。

桌子:

LogID       [int]
LogContent  nvarchar(max)

内容:

╔═══════╦══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
║ LogID ║ LogContent (JSON in nvarchar)                                                                                        ║
╠═══════╬══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╣
║ 1     ║ [{"DateTime":"2020-04-15T00:00:31","PropertyIWant":"ABC"}, {"DateTime":"2020-04-15T00:00:32","PropertyIWant":"DEF"}] ║
║ 2     ║ [{"DateTime":"2020-04-15T00:00:33","PropertyIWant":"GHI"}, {"DateTime":"2020-04-15T00:00:34","PropertyIWant":"JKL"}] ║
╚═══════╩══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝

结果我想要:

╔═══╦═════════════════════╦═══════════════╗
║   ║ DateTime            ║ PropertyIWant ║
╠═══╬═════════════════════╬═══════════════╣
║ 1 ║ 2020-04-15T00:00:31 ║ ABC           ║
║ 2 ║ 2020-04-15T00:00:32 ║ DEF           ║
║ 3 ║ 2020-04-15T00:00:33 ║ GHI           ║
║ 4 ║ 2020-04-15T00:00:34 ║ JKL           ║
╚═══╩═════════════════════╩═══════════════╝

我用 CROSS APPLY 和 JSON_QUERY 尝试了一些东西,但直到现在还没有运气。

一个例子是:

SELECT jt.PropertyIWant FROM Table CROSS APPLY
(
    SELECT * FROM OPENJSON (Table.LogContent) WITH (DateTime datetimeoffset](7), PropertyIWant nvarchar(255) '$.PropertyIWant')
) jt

但是当数据库中只有 77 行时,这将返回 219.851 行。在我的数据库中,它应该返回大约 13.000 条记录。

4

1 回答 1

2

如果您的数据库版本是 2016+,那么您可以使用JSON_QUERY嵌套在OPENJSON函数中,其中包含WITH解释返回列的模型的子句:

SELECT DateTime, PropertyIWant
  FROM tab
  CROSS APPLY OPENJSON(JSON_QUERY(LogContent, '$'))
           WITH (DateTime      nvarchar(500) '$.DateTime',
                 PropertyIWant nvarchar(500) '$.PropertyIWant');

Demo

于 2020-04-15T05:28:21.380 回答