在Clob字段中查询XML

时间:2017-11-29 06:28:13

标签: sql oracle

我有这个查询但是当我使用左外连接 与XML 时它不起作用,拜托,您能帮我解决吗?< / p>

错误:ORACLE Sql Developer

SELECT
xmltype(x.texto_extenso).extract('/Datos/ID/text()').getclobVal() ID
,xmltype(x.texto_extenso).extract('/Datos/TITULAR/text()').getclobVal() Nombre
,xmltype(x.texto_extenso).extract('/Datos/CS/text()').getclobVal() LLAVE_JEFE
,xmltype(x2.texto_extenso).extract('/Datos/TITULAR/text()').getclobVal() NOMBRE_JEFE

 FROM testXML x
 LEFT OUTER JOIN testXML x2 
 ON xmltype(x.texto_extenso).extract('/Datos/CS/text()').getclobVal() = 
    xmltype(x2.texto_extenso).extract('/Datos/ID/text()').getclobVal()

 WHERE x.LLAVE_TIPO_TEXTO = 11635;

查询:

create table testXML (
llave_texto varchar2(20) 
,llave_tipo_texto varchar2(20) 
,texto_extenso clob default empty_clob()
);

表格定义:

 insert into testXML values ('1','11635','<Datos><ID>1</ID><TITULAR>Gobernador</TITULAR><CS>0</CS></Datos>');
 insert into testXML values ('2','11635','<Datos><ID>2</ID><TITULAR>Acapulco</TITULAR><CS>1</CS></Datos>');
 insert into testXML values ('3','11635','<Datos><ID>3</ID><TITULAR>Cuernavaca</TITULAR><CS>1</CS></Datos>');
 insert into testXML values ('4','11635','<Datos><ID>4</ID><TITULAR>Coyoacán</TITULAR><CS>1</CS></Datos>');

插入内容:

print (df)
  country  year      indicatorName  value
0     USA  1970  Agricultural Land     10
1     USA  1970    Crop production      2
2     USA  2000  Agricultural Land     10
3     USA  2000    Crop production      3
4  Mexico  1970  Agricultural Land     10
5  Mexico  1970    Crop production      5
6  Mexico  2000  Agricultural Land     10
7  Mexico  2000    Crop production      4  

df = (df.set_index(['country','year','indicatorName'])['value']
       .unstack()
       .assign(crop_prod_density=lambda x: x['Crop production'].div(x['Agricultural Land'])))
print (df)
indicatorName  Agricultural Land  Crop production  crop_prod_density
country year                                                        
Mexico  1970                  10                5                0.5
        2000                  10                4                0.4
USA     1970                  10                2                0.2
        2000                  10                3                0.3

1 个答案:

答案 0 :(得分:1)

试试这个。

WITH tst
     AS (SELECT x.LLAVE_TIPO_TEXTO,
                xmltype (x.texto_extenso).EXTRACT ('/Datos/ID/text()').getclobVal ()
                   ID,
                xmltype (x.texto_extenso).EXTRACT ('/Datos/TITULAR/text()').getclobVal ()
                   Nombre,
                xmltype (x.texto_extenso).EXTRACT ('/Datos/CS/text()').getclobVal ()
                   LLAVE_JEFE
           FROM testXML x)
SELECT x.ID,
       x.Nombre,
       x.LLAVE_JEFE,
       x2.NOMBRE NOMBRE_JEFE
  FROM tst x
       LEFT OUTER JOIN tst x2 ON TO_CHAR (x.LLAVE_JEFE) = TO_CHAR (x2.ID)
 WHERE x.LLAVE_TIPO_TEXTO = 11635;