在我的交易 SQL table 的 json 列中获取数组的最后一个元素

GET last element of array in json column of my Transact SQL table

感谢您的帮助。

我的 table CONVERSATIONS 结构如下:

[ ID , JSON_CONTENT ]

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

在 JSON_CONTENT 栏中,我是这样的:

{
    "id_conversation" : "25bc8cbffa8b4223a2ed527e30d927bf", 
    "exchanges": [
        {
            "A" : "...",
            "B": "..."
        },
        {
            "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。

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

感谢帮助<3

如果我没理解错的话,您需要一个额外的 APPLY 运算符以及 OPENJSON()ROW_NUMBER() 的组合。 OPENJSON() 调用的结果是具有列 keyvaluetype 的 table,当 JSON 内容是一个数组时, key列returns指定数组中元素的索引:

Table:

SELECT ID, JSON_CONTENT
INTO CONVERSATION
FROM (VALUES
  (1, '{"id_conversation":"25bc8cbffa8b4223a2ed527e30d927bf","exchanges":[{"A":"...","B":"..."},{"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 表达式中的有效数组索引,但您可以通过索引访问 JSON 数组中的项目(例如 '$.exchanges[2]').