2015-09-03 2 views
1

У меня есть поле базы данных, содержащий XML вложен, как это:SQL, чтобы соответствовать содержанию вложенного узла XML

<configuration> 
    <modules> 
    <genericMailer> 
     <moduleContent> 
     <data> 
      <sendMethod>Email</sendMethod> 

Мой XML может содержать множество экземпляров <genericMailer> элемента (и это подузлы). Я хочу найти все строки, где есть какие-либо экземпляры <genericMailer>, где <sendMethod> содержит «Почта».

я могу получить все значения для sendMethod как это:

SELECT a.ApplicationId, 
     x.XmlCol.value('(moduleContent/data/sendMethod)[1]','VARCHAR(100)') AS SendMethod 
FROM Applications a 
CROSS APPLY a.AppConfig.nodes('/configuration/modules/genericMailer') x(XmlCol); 

однако я не знаю, как искать только для сравнения значений. Что такое предложение WHERE, в котором я нуждаюсь?

+1

Какую базу данных и какой версии? – Brad

ответ

2

Вот несколько возможных способов:

a. Используя value() метод для извлечения sendMethod значение затем проверить, если значение LIKE '%mail%' в ИНЕКЕ:

SELECT a.ApplicationId, 
     x.XmlCol.value('(moduleContent/data/sendMethod)[1]','VARCHAR(100)') AS SendMethod 
FROM Applications a 
CROSS APPLY a.AppConfig.nodes('/configuration/modules/genericMailer') x(XmlCol) 
WHERE x.XmlCol.value('(moduleContent/data/sendMethod)[1]','VARCHAR(100)') LIKE '%mail%' 

б. Используя метод XPath , чтобы проверить, если sendMethod значение содержит подстроку "mail" и SQL Server, метод exist() для фильтрации строк, которые проходят проверку:

SELECT a.ApplicationId, 
     x.XmlCol.value('(moduleContent/data/sendMethod)[1]','VARCHAR(100)') AS SendMethod 
FROM Applications a 
CROSS APPLY a.AppConfig.nodes('/configuration/modules/genericMailer') x(XmlCol) 
WHERE x.XmlCol.exist('moduleContent/data/sendMethod[contains(.,"mail")]') = 1 
+0

Спасибо, что [1] за тот узел, который нас интересует? – Izzy

+0

@Izzy Смотрите документацию 'exist()': https://msdn.microsoft.com/en-us/library/ms189869.aspx – har07

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