【问题标题】:How to get array index from Oracle JSON column?如何从 Oracle JSON 列中获取数组索引?
【发布时间】:2018-09-01 10:43:41
【问题描述】:

拥有这样的 JSON(我知道 JSON 不支持 cmets。在本例中用于说明这个想法):

{
    "people": [
        {                       --//  <-- index 0
            "id": 100,
            "name": "John Doe"
        },
        {                       --//  <-- index 1
            "id": 101,
            "name": "Jane Roe"
        }
    ]
}

我们可以像这样从数组中的特定元素中选择值:

SELECT name
FROM JSON_TABLE(
    '{
        "people": [
            {
                "id": 100,
                "name": "John Doe"
            },
            {
                "id": 101,
                "name": "Jane Roe"
            },
        ]
    }', '$.people[*]' 
    COLUMNS(
        ID      NUMBER      PATH '$.id',
        NAME    VARCHAR2    PATH '$.name'
    )
) info
WHERE info.id = 101

结果:

NAME
--------
Jane Roe

有没有办法获取数组中的元素索引?比如:

SELECT array_index    --//  <-- how get the array index of the element found?
FROM JSON_TABLE(
--// ...
) info
WHERE info.id = 101

结果:

ARRAY_INDEX
-----------
1

是否可以使用 Oracle 12c 中的 JSON 支持来做这样的事情?

【问题讨论】:

  • 一个 JSON 被解析成关系记录。关系记录没有数组索引。您可以使用 rownum 为所选记录分配编号。

标签: json oracle oracle12c


【解决方案1】:
COLUMNS(
        idx FOR ORDINALITY,
        ID      NUMBER      PATH '$.id',
        NAME    VARCHAR2    PATH '$.name'
)

应该适合你

【讨论】:

  • 这会在结果列表中添加一个 rownum,但 OP 想要原始列表的索引,对于 id 101 来说是 1,对于 id 100 来说是 0
  • 答案是正确的,(idx-1) 总是给出想要的索引。顺便说一句,请注意 12.1.0.2.0 中的 for ordinality。有一个需要补丁 support.oracle.com/rs?type=patch&id=20885778 的错误在 12.2 中可以正常工作
【解决方案2】:

正如 ArtBajji 所写,行本身没有索引。因此你需要创建一个相对固定的“假身份证”。

这可以通过给你的数据一个顺序(order by id)和一个索引(rownum)来实现。然后从这个“修改过的”表中选择

SELECT name, indx FROM (
SELECT ind.*, rownum "INDX"
FROM JSON_TABLE(
    '{
        "people": [
            {
                "id": 100,
                "name": "John Doe"
            },
            {
                "id": 101,
                "name": "Jane Roe"
            },
        ]
    }', '$.people[*]' 
    COLUMNS(
        ID      NUMBER      PATH '$.id',
        NAME    VARCHAR2    PATH '$.name'
    )
) ind order by id) tab
WHERE tab.id = 101

id 100 为 1,id 101 为 2。

请注意,如果插入 id

【讨论】:

    猜你喜欢
    • 2020-06-19
    • 2022-12-06
    • 2019-07-30
    • 2017-10-23
    • 1970-01-01
    • 2017-10-29
    • 2020-10-25
    • 1970-01-01
    • 2016-03-20
    相关资源
    最近更新 更多