我正在查询Oracle中的数据集,该数据集的某些格式为structs。

问题描述 投票:0回答:1

| id | firstname | lastname | age | | -- | --------- | -------- | --- | | 1 | John | Smith | 10 | | 2 | Jane | Smith | 12 | | 3 | Bob | White | 13 | | 4 | Betty | White | 11 |

我已经能够在其他SQL编辑器中获得此期望的结果,但是Oracle中的同样的语法给了我错误

ORA-00904: "PERSON"."FIRSTNAME": invalid identifier

其他方法:

SELECT id, person.firstName, person.lastName, person.age FROM table

我觉得有一个简单的方法可以查询此问题,但是我在堆栈溢出和Google上搜索到了远处的空白。
    

说:

您的数据是有效的JSON(您的数据不是您的,但您可能已经误入它了,您说您的查询与其他编辑器一起使用,这使其似乎应该是一种已知格式);和

您正在连接到Oracle数据库(SQL Developer通常与Oracle数据库一起使用,但可以连接到其他数据库)

然后在列名之前使用表名称/别名:

sql oracle-database
1个回答
1
投票

或使用

JSON_TABLE
    解析数据:
  • SELECT id, j.* FROM table_name t CROSS APPLY JSON_TABLE( t.person, '$' COLUMNS ( firstname VARCHAR2(20) PATH '$.firstName', lastname VARCHAR2(20) PATH '$.lastName', age NUMBER PATH '$.age' ) ) j;
  • ,对于具有有效JSON的示例数据的哪个(请注意围绕
firstName

值的引号):

CREATE TABLE table_name (
  id NUMBER PRIMARY KEY,
  person CLOB CHECK (person IS JSON)
);

INSERT INTO table_name (id, person)
  SELECT 1, '{"firstName":"John","lastName":"Smith","age":"10"}' FROM DUAL UNION ALL
  SELECT 2, '{"firstName":"Jane","lastName":"Smith","age":"12"}' FROM DUAL UNION ALL
  SELECT 3, '{"firstName":"Bob","lastName":"White","age":"13"}' FROM DUAL UNION ALL
  SELECT 4, '{"firstName":"Betty","lastName":"White","age":"11"}' FROM DUAL;

输出:


Id

firstname
lastname


1约翰 102Jane匠 1213 betty白11
3 Bob
4
Fiddle
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.