在我的 Transact SQL 表的 json 列中获取数组的最后一个元素

问题描述

感谢您的帮助。

我的表格 CONVERSATIONS 以这样的列结构:

[ ID,JSON_CONTENT ]

在列 ID 中,我在 Varchar 中有一个简单的 id

在列 JSON_CONTENT 我是这样的:

{
    "id_conversation" : "25bc8cbffa8b4223a2ed527e30d927bf","exchanges": [
        {
            "A" : "...","B": "..."
        },{
            "A" : "...","Z" : "..."
        }
    ]
}

我想查询获取交换的 id 和 last 元素:

[ ID,LAST_ELT_IN_EXCHANGE_IN_JSON_CONTENT]

我想这样做:

select TOP 3 ID,JSON_QUERY(JSON_CONTENT,'$.exchange[-1]')
from CONVERSATION

当然,Transact sql 不是 Python。

我看到了这些答案,但我不知道如何应用到我的问题中。

Select last value from Json array

感谢您的帮助

解决方法

如果我理解正确,您需要一个额外的 APPLY 运算符以及 OPENJSON()ROW_NUMBER() 的组合。 OPENJSON() 调用的结果是一个包含 keyvaluetype 列的表,当 JSON 内容是数组时,key 列返回指定数组中元素的索引:

表格:

SELECT ID,JSON_CONTENT
INTO CONVERSATION
FROM (VALUES
  (1,'{"id_conversation":"25bc8cbffa8b4223a2ed527e30d927bf","exchanges":[{"A":"...","B":"..."},{"A":"...","Z":"..."}]}')
) v (ID,JSON_CONTENT)

声明:

SELECT c.ID,j.[value]
FROM CONVERSATION c
OUTER APPLY (
   SELECT [value],ROW_NUMBER() OVER (ORDER BY CONVERT(int,[key]) DESC) AS rn
   FROM OPENJSON(c.JSON_CONTENT,'$.exchanges') 
) j   
WHERE j.rn = 1

结果:

ID  value
------------------------
1   {
            "A" : "...","Z" : "..."
    }

请注意,-1 不是您的 path 表达式中的有效数组索引,但您可以通过索引(例如 '$.exchanges[2]')访问 JSON 数组中的项目。