1
<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

`

私が言ったように、位置は変化し続けるので、それに対処する方法を知らない必要があります

4

1 に答える 1

0

使用する

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

ケースステートメントの代わりに。使用している rdbms を指定していないため、エンジンが範囲外のインデックスを持つ xpath 式を許容するかどうかわかりません (この状況は、 valueの属性をp持つ要素がない場合に発生します)。ただし、指定された sql 式を呼び出しでラップするだけで十分です。pdid67COALESCE(..., '')

于 2013-05-14T17:27:18.860 に答える