如何剥离XML数据

时间:2013-05-14 14:45:06

标签: sql xml database rdbms

<ps>
    <p pdid="47" pv="x@xx.net" />
    <p pdid="49" pv="07827100000" />
    <p pdid="57" pv="dfdfdf Armstrong" />
    <p pdid="29" pv="[(null)]" />
    <p pdid="1" pv="[(null)]" />
    <p pdid="39" pv="[(null)]" />
    <p pdid="43" pv="[(null)]" />
    <p pdid="5" pv="[(null)]" />
    <p pdid="7" pv="[(null)]" />
    <p pdid="9" pv="[(null)]" />
    <p pdid="25" pv="[(null)]" />
    <p pdid="37" pv="[(null)]" />
    <p pdid="11" pv="[(null)]" />
    <p pdid="15" pv="[(null)]" />
    <p pdid="35" pv="[(null)]" />
    <p pdid="13" pv="[(null)]" />
    <p pdid="17" pv="[(null)]" />
    <p pdid="41" pv="[(null)]" />
    <p pdid="55" pv="[(null)]" />
    <p pdid="21" pv="[(null)]" />
    <p pdid="23" pv="[(null)]" />
    <p pdid="31" pv="[(null)]" />
    <p pdid="45" pv="[(null)]" />
    <p pdid="53" pv="[(null)]" />
    <p pdid="59" pv="[(null)]" />
    <p pdid="63" pv="[(null)]" />
    <p pdid="65" pv="[(null)]" />
    <p pdid="67" pv="LDC Data" />
    <p pdid="69" pv="[(null)]" />
    <p pdid="70" pv="[(null)]" />
    <p pdid="72" pv="12580672" />
    <p pdid="74" pv="CA1" />
</ps>

以上数据是XML格式的 - 所以我如何获得PDID =“67”的PV值 - 请记住,PDID的XML位置不断逐行变化。

我试过了

`

 Select 
     iset.NAME AS Region   
    ,iset.custom_f
    ,CASE WHEN REPLACE(iset.custom_f.value('(/ps/p/pdid="67"/@pv)[30]',   'varchar(80)'),'[(null)]','') <> ''  THEN
             REPLACE(iset.custom_f.value('(/ps/p/pdid="67"/@pv)[30]', 'varchar(80)'),'[(null)]','')
        WHEN REPLACE(iset.custom_f.value('(/ps/p/pdid="67"/@pv)[31]', 'varchar(80)'),'[(null)]','') <> '' THEN
             REPLACE(iset.custom_f.value('(/ps/p/pdid="67"/@pv)[31]', 'varchar(80)'),'[(null)]','')
        WHEN REPLACE(iset.custom_f.value('(/ps/p/pdid="67"/@pv)[28]', 'varchar(80)'),'[(null)]','') <> '' THEN                   
             REPLACE(iset.custom_f.value('(/ps/p/pdid="67"/@pv)[28]', 'varchar(80)'),'[(null)]','')
        WHEN REPLACE(iset.custom_f.value('(/ps/p/pdid="67"/@pv)[29]', 'varchar(80)'),'[(null)]','') <> '' THEN                   
             REPLACE(iset.custom_f.value('(/ps/p/pdid="67"/@pv)[29]', 'varchar(80)'),'[(null)]','')
   END AS LeadSource  
  ,iset.Source
  ,ISET.oc_id
  ,CASE WHEN ISNULL(ISET.app_id,'') <> '' THEN 1 ELSE 0
   END app   
from 
intial_set iset

`

正如我所提到的,这个位置一直在变化所以我不需要知道如何应对它

1 个答案:

答案 0 :(得分:0)

使用

REPLACE(
      iset.custom_f.value(
            '(/ps/p[@pdid="67"]/@pv)[1]'
          , 'varchar(80)'
      )
    ,'[(null)]'
    ,''
) AS LeadSource

而不是你的案例陈述。你没有指定你正在使用的rdbms,所以我不知道你的引擎是否容忍索引超出范围的xpath表达式(如果没有p元素有{{{},则会出现这种情况1}}具有值pdid的atrribute。但是,用67调用包装给定的sql表达式就足够了。