【问题标题】:GET last element of array in json column of my Transact SQL table获取我的 Transact SQL 表的 json 列中数组的最后一个元素
【发布时间】:2021-03-05 11:31:13
【问题描述】:

感谢您的帮助。

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

[ ID , JSON_CONTENT ]

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

在 JSON_CONTENT 列中我是这样的:

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

我想查询并获取exchange的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

感谢您的帮助

【问题讨论】:

    标签: sql json sql-server tsql json-query


    【解决方案1】:

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

    表:

    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]')。

    【讨论】:

      猜你喜欢
      • 2016-09-29
      • 1970-01-01
      • 2018-08-25
      • 1970-01-01
      • 2020-06-15
      • 2017-08-27
      • 1970-01-01
      • 2017-11-08
      • 2017-02-18
      相关资源
      最近更新 更多