2015-07-23 1 views
0

Я пытаюсь прочитать xml и сохранить его на сервере SQL.Если условие на выбор узла XML в SQL

DECLARE @xml XML 
SET @xml = 
'<report> 
    <personal> 
     <search> 
      <subject> 
       <name>SearchName</name> 
      </subject> 
     </search>  
    </personal> 
    <personal> 
     <search> 
      <subject> 
       <name>SearchName</name> 
      </subject> 
     </search> 
     <result> 
      <history> 
       <name>HistoryName</name> 
      </history> 
     </result> 
    </personal> 
    </report> 
' 

Что я пытаюсь здесь - выбрать имя, но условием является если <personal> содержит <result> затем выберите name под history/name

если <personal> не содержит <result> выбрать name под subject/name

В настоящее время я выбираю имена по личным/предмету, как показано ниже:

Select 
A.Search.value('(subject/name)[1]','varchar(max)') 
FROM @xml.nodes('/report/personal/search') as A(Search) 

Ожидая результат:

SearchName 
HistoryName 

Как добавить условие между ними?

Есть ли способ, мы можем добавить такое условие здесь

SELECT @xml.exist('//report//personal//search//subject//name') 

ответ

0

Это:

SELECT 
    COALESCE(
     A.Search.value('(result/history/name)[1]','varchar(max)'), 
     A.Search.value('(search/subject/name)[1]','varchar(max)') 
    ) AS Name 
FROM @xml.nodes('/report/personal') as A(Search) 

вернется:

Name 
------------ 
SearchName 
HistoryName 
+1

Спасибо. Это работает для меня. – user1893874

+0

@ user1893874 С удовольствием помогите :) – jpw

1
Select coalesce(A.Search.value('(result/history/name)[1]', 'varchar(max)'), A.Search.value('(search/subject/name)[1]','varchar(max)')) 
FROM @xml.nodes('/report/personal') as A(Search) 
+0

возвращает SearchName, но я хочу, чтобы получить как SearchName, так и HistoryName в одном запросе – user1893874

+0

Да, это то, что я ищу. Спасибо :) – user1893874

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