我有一个名为CRS.CRS_FILES的oracle数据库表,其中有一个名为FILE_DATA的列-其中CLOB列是一个大型XML字符串。
supply_conversion_chart
以下是模式的前几行:
FILE_DATA FILE_CREATION_DATE
<?xml version="1.0" encoding="utf-8"?><REPORT 1/1/2020
<?xml version="1.0" encoding="utf-8"?><REPORT 1/5/2020
<?xml version="1.0" encoding="utf-8"?><REPORT 1/6/2019
<?xml version="1.0" encoding="utf-8"?><REPORT 1/1/2020
<?xml version="1.0" encoding="utf-8"?><REPORT 1/5/2020
我可以使用以下命令在R中进行查询:
CREATE TABLE CRS.CRS_FILES ( FILE_DATA CLOB );
INSERT INTO CRS.crs_files VALUES (
'<?xml version="1.0" encoding="utf-8" ?>
<REPORT xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/CrashReport.DataLayer.v20170201">
<CRSREPORTTIMESTAMP>2020-10-08T06:49:31.813812</CRSREPORTTIMESTAMP>-
<AGENCYIDENTIFIER>MILWAUKEE</AGENCYIDENTIFIER>-
<AGENCYNAME>Milwaukee Police Department</AGENCYNAME>
</REPORT>'
)
输出:
query_string2 <- "SELECT x.agencyname
FROM CRS.CRS_FILES c
CROSS JOIN XMLTABLE(
XMLNAMESPACES(
'http://www.w3.org/2001/XMLSchema-instance' AS \"i\",
DEFAULT 'http://schemas.datacontract.org/2004/07/CrashReport.DataLayer.v20170201'
),
'/REPORT'
PASSING XMLTYPE( c.file_data )
COLUMNS
crsreporttimestamp TIMESTAMP PATH 'CRSREPORTTIMESTAMP',
agencyidentifier VARCHAR2(50) PATH 'AGENCYIDENTIFIER',
agencyname VARCHAR2(100) PATH 'AGENCYNAME'
) x"
idtable <- sqlQuery(ch,query_string2, max=10)
没有指定每个变量和路径(所有变量都在REPORT的节点/子注释中,但是有数百个)。如何构造这样的查询,这样就不必列出所有变量(例如我如何通过上面传递的XMLtype在查询中添加| AGENCYNAME |
| :-------------------------- |
| Milwaukee Police Department |
和agencyidentifier
)。这种方法必须可行(在R中查询)。谢谢。
仅提供上下文,这是一些我需要添加的子节点示例,它显示了有多少个不同的组
agencyname
如果您想尝试一些操作,这里是另一位用户创建的小提琴:
report_no VARCHAR(35) PATH '/VEHICLEs/CRSVEHICLE/PASSENGERs/PASSENGER/PERSON/REPORTNUMBER',
person_id VARCHAR(50) PATH '/VEHICLEs/CRSVEHICLE/PASSENGERs/PASSENGER/PERSON/PERSONID',
vehicle_id VARCHAR(50) PATH '/VEHICLEs/CRSVEHICLE/PASSENGERs/PASSENGER/VEHICLEID'
和
https://dbfiddle.uk/?rdbms=oracle_18&fiddle=abfa4cbbea535f22415a851cb625045e