使用 ORDER BY 压平雪花 JSON

问题描述

我有一个工作查询,可将嵌套的 JSON 对象展平为数据行。然而,我想要做的是保留嵌套了几层的一组对象的原始顺序。

我尝试将 updateUserMarker: (marker,markerIndex) => { let updatedMarkers = user.markers.map(element => element.id == markerIndex ? { ...element,...marker } : element ); setUser({ ...user,markers: [...updatedMarkers] }); } ROW_NUMBERORDER BY NULL 一起使用,但似乎都没有保留顺序。

关于如何实现这一目标的任何想法?下面的例子。我选择屏蔽真实数据,但结构的重要部分是相同的。 JSON 格式的数据没有等级识别信息,但我在这里以数字为例来展示奇怪的结果。

原始结构(屏蔽):

ORDER BY (SELECT NULL)

示例查询屏蔽):

{
    "topNode: {
        "childNode": {
            "list": [
                {
                    "title": "example title 1",},{
                    "title": "example title 2",{
                    "title": "example title 3",{
                    "title": "example title 4",{
                    "title": "example title 5",}
            ]
        }
    }
}

示例输出

SELECT 
    A.VALUE:"title"::VARCHAR AS "TITLE",ROW_NUMBER() OVER(ORDER BY NULL) AS RANK
FROM 
    DB.SCHEMA.TABLE as A,lateral flatten(input=>A.JSON:topNode.childNode.list) "list_flatten"

解决方法

可以使用 INDEX,它返回数组中元素的索引:

SELECT A.VALUE:"title"::VARCHAR AS "TITLE","list_flatten".index AS "RANK"
FROM DB.SCHEMA.TABLE as A,lateral flatten(input=>A.JSON:topNode.childNode.list) "list_flatten"