2014-02-13 2 views
0

У меня есть таблица, которая содержит столбец XML и мои данные выглядит примерно так:SQL-запрос для извлечения значения из столбца XML

<Entries> 
    <Entry Default="No" ValueId="1" Sequence="1" Deleted="Yes"><Undefined></Entry>  
    <Entry Default="No" ValueId="2" Sequence="1">Non-Purulent</Entry>  
    <Entry Default="No" ValueId="4" Sequence="2" Deleted="Yes">Sanguinous</Entry>  
    <Entry Default="No" ValueId="11" Sequence="2">Odor Present</Entry>  
    <Entry Default="No" ValueId="3" Sequence="3">Purulent</Entry>  
    <Entry Default="No" ValueId="5" Sequence="3" Deleted="Yes">Serosangiunous</Entry>  
    <Entry Default="No" ValueId="6" Sequence="4">Sanguineous</Entry>  
    <Entry Default="No" ValueId="7" Sequence="4" Deleted="Yes">Serosanguineous</Entry>  
    <Entry Default="No" ValueId="8" Sequence="5">Serous</Entry>  
    <Entry Default="No" ValueId="10" Sequence="6">Sero-sanguineous</Entry>  
    <Entry Default="No" ValueId="9" Sequence="7">Other</Entry>  
</Entries> 

Я хочу, чтобы получить значение, которые не имеют Deleted = " Да ". Я очень новичок в использовании XML-запросов, поэтому я буду благодарен за всю помощь, которую я могу получить.

ответ

1

Если вы пишете SQL как теги, и вы на самом деле означает SQL Server тем, что - то вы можете использовать что-то вроде этого (предполагая, что ваш стол называется YourTable и столбец проведения XML называется XmlColumn - пожалуйста адаптировать к вашей реальной ситуации):

-- define a CTE (Common Table Expression) and extract detail info from XML 
;WITH XmlCte AS 
(
    SELECT 
     ID, 
     XmlText = XC.value('(.)[1]', 'varchar(20)'), 
     XmlValueId = XC.value('(@ValueId)[1]', 'int'), 
     XmlSequence = XC.value('(@Sequence)[1]', 'int'), 
     XmlDeleted = XC.value('(@Deleted)[1]', 'varchar(10)') 
    FROM dbo.YourTable 
    CROSS APPLY XmlColumn.nodes('/Entries/Entry') AS XT(XC) 
) 
SELECT 
    XmlValueId, 
    XmlSequence, 
    XmlText 
FROM XmlCte 
WHERE XmlDeleted IS NULL 
+0

Большое спасибо marc_s. да, я должен был пометить правильную СУБД здесь. Я запомню это. Да, это SQL-сервер –

0

по marc_s, пожалуйста, помечать ваш RDBMS

на offchance вы имеете в виду SQL Server, вот на е способ сделать это с помощью XQuery

SELECT 
    Nodes.node.value('@Sequence', 'varchar(50)') AS Sequence, 
    Nodes.node.value('(./text())[1]', 'varchar(50)') AS Value 
FROM 
    MyTable xyz 
    cross apply xyz.XmlColumn.nodes('/Entries/Entry[not(@Deleted="Yes")]') as Nodes(node); 

SqlFiddle here

Обратите внимание, что вам нужно, чтобы сделать ваш XML хорошо определены, т.е. <Undefined>. либо нужно будет добавить в раздел CDATA, либо вам нужно будет закрыть тег.

Смежные вопросы