如何将单个 xmltype 标记中的值提取到 oracle 中的不同列中?
How to extract values from a single xmltype tag into different columns in oracle?
我在 table 中有一个 xmltype 列,其中包含以下标记
<LOCATION TYPE="ABS" EPSG="4277" UNIT="decLL">
<X>-2.12105834</X>
<Y>49.20372223</Y>
</LOCATION>
我使用以下查询提取了列中类型的值
SELECT a.object_id,a.xml_data.extract('//LOCATION/@TYPE').getStringVal() AS "Location Type"
FROM object_history a;
table 中单列的输出是 ABSABSREL。
我想在 table 的单独列中获取每个值。
请帮助如何做到这一点?
使用XMLTABLE
:
SELECT object_id,
x.*
FROM object_history h
CROSS APPLY XMLTABLE(
'/LOCATION'
PASSING h.xml_data
COLUMNS
type VARCHAR2(3) PATH './@TYPE',
epsg NUMBER PATH './@EPSG',
unit VARCHAR2(10) PATH './@UNIT',
x NUMBER PATH './X',
y NUMBER PATH './Y'
) x
其中,对于示例数据:
CREATE TABLE object_history ( object_id, xml_data ) AS
SELECT 1, XMLTYPE('<LOCATION TYPE="ABS" EPSG="4277" UNIT="decLL"><X>-2</X><Y>49</Y></LOCATION>') FROM DUAL UNION ALL
SELECT 2, XMLTYPE('<LOCATION TYPE="ABS" EPSG="4277" UNIT="decLL"><X>-1</X><Y>50</Y></LOCATION>') FROM DUAL UNION ALL
SELECT 3, XMLTYPE('<LOCATION TYPE="REL" EPSG="4277" UNIT="decLL"><X>0</X><Y>51</Y></LOCATION>') FROM DUAL;
输出:
OBJECT_ID
TYPE
EPSG
UNIT
X
Y
1
ABS
4277
decLL
-2
49
2
ABS
4277
decLL
-1
50
3
REL
4277
decLL
0
51
db<>fiddle here
我在 table 中有一个 xmltype 列,其中包含以下标记
<LOCATION TYPE="ABS" EPSG="4277" UNIT="decLL">
<X>-2.12105834</X>
<Y>49.20372223</Y>
</LOCATION>
我使用以下查询提取了列中类型的值
SELECT a.object_id,a.xml_data.extract('//LOCATION/@TYPE').getStringVal() AS "Location Type"
FROM object_history a;
table 中单列的输出是 ABSABSREL。 我想在 table 的单独列中获取每个值。 请帮助如何做到这一点?
使用XMLTABLE
:
SELECT object_id,
x.*
FROM object_history h
CROSS APPLY XMLTABLE(
'/LOCATION'
PASSING h.xml_data
COLUMNS
type VARCHAR2(3) PATH './@TYPE',
epsg NUMBER PATH './@EPSG',
unit VARCHAR2(10) PATH './@UNIT',
x NUMBER PATH './X',
y NUMBER PATH './Y'
) x
其中,对于示例数据:
CREATE TABLE object_history ( object_id, xml_data ) AS
SELECT 1, XMLTYPE('<LOCATION TYPE="ABS" EPSG="4277" UNIT="decLL"><X>-2</X><Y>49</Y></LOCATION>') FROM DUAL UNION ALL
SELECT 2, XMLTYPE('<LOCATION TYPE="ABS" EPSG="4277" UNIT="decLL"><X>-1</X><Y>50</Y></LOCATION>') FROM DUAL UNION ALL
SELECT 3, XMLTYPE('<LOCATION TYPE="REL" EPSG="4277" UNIT="decLL"><X>0</X><Y>51</Y></LOCATION>') FROM DUAL;
输出:
OBJECT_ID TYPE EPSG UNIT X Y 1 ABS 4277 decLL -2 49 2 ABS 4277 decLL -1 50 3 REL 4277 decLL 0 51
db<>fiddle here