问题描述
感谢您的帮助。
我的表格 CONVERSATIONS 以这样的列结构:
[ ID,JSON_CONTENT ]
在列 ID 中,我在 Varchar 中有一个简单的 id
在列 JSON_CONTENT 我是这样的:
{
"id_conversation" : "25bc8cbffa8b4223a2ed527e30d927bf","exchanges": [
{
"A" : "...","B": "..."
},{
"A" : "...","Z" : "..."
}
]
}
[ 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()
调用的结果是一个包含 key
、value
和 type
列的表,当 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 数组中的项目。