SQL从关键字搜索左侧的列中的大字符串中提取字符串

时间:2017-01-09 17:36:51

标签: sql sql-server

我有一个表,其中一列是XML代码压缩成一行。因为它是XML,所以我不能做一个charIndex因为有很多'<' '>'在线。

我需要一种从列上的字符串搜索中提取双字母代码的方法。

EX)该列被称为' XMLMessage'并包含:

<p1:UniversalInterchange xmlns:p1="http://www.cargowise.com/Schemas/Native">
  <Header xmlns="">
    <SenderID/>
    <RecipientID/>
  </Header>
  <Body xmlns="">
    <UniversalEvent>
      <Event>
        <EventType>DEP</EventType>
        <EventTime>2016-02-04T13:37:00</EventTime>
        <ContextCollection>
          <Context>
            <Type>MAWBNumber</Type>
            <Value>057-23154670</Value>
          </Context>
          <Context>
            <Type>MAWBOriginIATAAirportCode</Type>
            <Value>IAD</Value>
          </Context>
          <Context>
            <Type>MAWBDestinationIATAAirportCode</Type>
            <Value>TUN</Value>
          </Context>
          <Context>
            <Type>MAWBNumberOfPieces</Type>
            <Value>1</Value>
          </Context>
          <Context>
            <Type>OtherServiceInfo</Type>
            <Value>
              PRD-XPS
            </Value>
          </Context>
          <Context>
            <Type>SourceEventCode</Type>
            <Value>DEP</Value>
          </Context>
          <Context>
            <Type>NumberOfPieces</Type>
            <Value>1</Value>
          </Context>
          <Context>
            <Type>WeightOfGoods</Type>
            <Value>2KG</Value>
          </Context>
          <Context>
            <Type>IATACarrierCode</Type>
            <Value>AF</Value>
          </Context>
          <Context>
            <Type>FlightNumber</Type>
            <Value>1184</Value>
          </Context>
          <Context>
            <Type>FlightDate</Type>
            <Value>04-FEB-2016</Value>
          </Context>
          <Context>
            <Type>OriginIATAAirportCode</Type>
            <Value>CDG</Value>
          </Context>
          <Context>
            <Type>DestinationIATAAirportCode</Type>
            <Value>TUN</Value>
          </Context>
          <Context>
            <Type>TimeOfDeparture</Type>
            <Value>2016-02-04T13:37:00</Value>
          </Context>
          <Context>
            <Type>TimeOfArrival</Type>
            <Value>2016-02-04T15:40:00</Value>
          </Context>
        </ContextCollection>
        <AdditionalFieldsToUpdateCollection>
          <AdditionalFieldsToUpdate>
            <Type>JobConsolTransport.JW_ATD</Type>
            <Value>2016-02-04T13:37:00</Value>
          </AdditionalFieldsToUpdate>
        </AdditionalFieldsToUpdateCollection>
      </Event>
    </UniversalEvent>
  </Body>
</p1:UniversalInterchange>

我需要找到&#39; AF&#39;在'IATACarrierCode&#39;之后搜索范围。

我需要一个select语句才能找到&#39; AF&#39;在&#39; IATACarrierCode&#39;之后它之后始终是一个2个字符的字符串。

3 个答案:

答案 0 :(得分:0)

如果我正确理解你的问题,我就是这样做的

b flatMap {
   x => ev(x) map {_.toString}
} 

答案 1 :(得分:0)

SQL Server本身支持XML,没有理由以字符串形式选择字段内容。

假设它是一个XML列:

SELECT c.value('(../Value)[1]', 'varchar(30)')
FROM table
CROSS APPLY table.xmlfield.nodes('(//Context/Type[text()="IATACarrierCode"])[1]') as t(c)

或者它只是一个字符串:

DECLARE @val XML = '<p1:UniversalInterchange...blah blah blah'
SELECT c.value('(../Value)[1]', 'varchar(30)') FROM @val.nodes('(//Context/Type[text()="IATACarrierCode"])[1]') as t(c)

答案 2 :(得分:0)

<a href="http://cdc.gov">CDC</a> 

这适用于charindex和substring