Oracle和多个JSON

shyt4zoc  于 2023-04-05  发布在  Oracle
关注(0)|答案(3)|浏览(142)

如果数据是这样的,如何在oracle中获得'id'列表?

{'id': 360006648459, 'value': None
},
{'id': 360002406974, 'value': None
},
{'id': 360003271394, 'value': None
},
{'id': 360020289239, 'value': None
}
...

我得到(null)当尝试这是预期的:

SELECT json_query(FIELD, '$.id')
FROM TABLE
1rhkuytd

1rhkuytd1#

select json_value(q'~{'id': 360006648459, 'value': None}~', '$.id') from dual ;

将返回ID

select json_query(q'~{'id': 360006648459, 'value': None}~', '$.id' with wrapper) from dual ;

将返回封装到数组中的id

z8dt9xmd

z8dt9xmd2#

如果你有非JSON示例数据:

CREATE TABLE table_name (field) AS
SELECT q'|{'id': 360006648459, 'value': None
},
{'id': 360002406974, 'value': None
},
{'id': 360003271394, 'value': None
},
{'id': 360020289239, 'value': None
}|' FROM DUAL;

然后你可以尝试将它转换为有效的JSON,方法是将它 Package 在数组[]括号中,并将None更改为null,然后你可以使用JSON解析器:

select j.id
from   table_name
       CROSS APPLY JSON_TABLE(
         '[' || REPLACE( field, 'None', 'null') || ']',
         '$[*]'
         COLUMNS (
           id path '$.id'
         )
       ) j;
  • 注意:这假设子字符串None只会出现在表示null值的上下文中;如果它可能出现在其他上下文中,则您可能无法使用此方法。*
  • 注2:从技术上讲,对象键周围的单引号不是有效的JSON;但是,Oracle会将它们当作有效的引号来解析。要转换为严格的JSON格式,您需要'[' || REPLACE( REPLACE( field, 'None', 'null'), '''', '"') || ']'。*

其输出:
| ID|
| --------------|
| 360006648459|
| 360002406974|
| 360003271394|
| 360020289239|
fiddle

gcmastyq

gcmastyq3#

假设你有一个有效的json,比如'{"id": 360006648459, "value": "None"},{"id": 360002406974, "value": "None"},{"id": 360003271394, "value": "None"},{"id": 360020289239, "value": "None"}'
然后,您可以使用json_table获得所需的输出

select id
from mytable, json_table(concat(concat('[', FIELD),']'), '$[*]' columns(id path '$.id')) t

Demo here

相关问题