2013-05-14 134 views
1
<ps> 
    <p pdid="47" pv="[email protected]" /> 
    <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形式 - 这样我怎么能得到PV值,其中PDID =“67” - 请记住PDID的XML位置不断通过排排从改变。 如何剥离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 

`

正如我所提到的位置不断变化的,所以我需要不知道如何应付它

+0

我已经提供了代码 - 您的帮助真的很赞赏这个 – user2382166 2013-05-14 15:11:57

+0

当问这个问题时,请使用所有能够帮助我们的标签。您的问题目前缺少指定您正在使用的RDBMS的标记。谢谢。 – 2013-05-14 15:40:49

回答

0

使用

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

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

+0

@ collapsar.Thanks这适用于我.. – user2382166 2013-05-14 23:30:01