Sql-сервер xpath условный запрос - PullRequest
0 голосов
/ 31 января 2019

У меня есть таблица, в которой одно поле с именем 'configuration' является типом XML:

<configuration>
  <element value="john" />
  <element value="kevin" />
  <element value="lisa" />
  <element value="david" />
  <element value="mike" />  
</configuration>

Что я хотел бы сделать, это получить все записи таблицы или, по крайней мере, подсчитать записи таблицы, которыеиметь поле 'configuration', содержащее хотя бы один атрибут 'element', содержащий атрибут 'value', равный 'lisa'.

На данный момент у меня есть запрос, который может извлечь атрибут 'value'указанной позиции 'элемента', например:

select Configuration.value('(/configuration/element/@value)[0]', 'nvarchar(max)') // returns me 'john'
select Configuration.value('(/configuration/element/@value)[1]', 'nvarchar(max)') // returns me 'kevin'

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Пожалуйста, попробуйте ниже,

declare @xml as xml
set @xml='<configuration>
  <element value="john" />
  <element value="kevin" />
  <element value="lisa" />
  <element value="david" />
  <element value="mike" />  
</configuration>'
    SELECT   T.c.value('./@value','nvarchar(250)'  )    As element         

    FROM @xml.nodes('//element') AS T(c) 

and the result is

0 голосов
/ 31 января 2019

Это немного псевдо-SQL при отсутствии набора данных и немного догадок;в этом (я думаю) вы просто хотите вернуть строки (?), где есть узел configuration/element, обладающий свойством value 'lisa'. ЕСЛИ мое предположение верно, тогда что-то подобное сработает (вам нужно заменить имена объектов в фигурных скобках ({}):

SELECT {Columns}
FROM [{Your Table}] YT
WHERE EXISTS (SELECT 1
              FROM [{Your Table}] E
                   CROSS APPLY E.[{Your XML Column}].nodes('configuration/element') C(E)
              WHERE E.[{Your ID Column}] = YT.[{Your ID Column}]
                AND C.E.value('./@value','varchar(50)') = 'lisa');

Пример:

WITH VTE AS(
    SELECT 1 AS ID,
           CONVERT(xml,'<configuration>
  <element value="john" />
  <element value="kevin" />
  <element value="lisa" />
  <element value="david" />
  <element value="mike" />  
</configuration>') AS XMlCol
    UNION ALL
    SELECT 2 AS ID,
           CONVERT(xml,'<configuration>
  <element value="craig" />
  <element value="donald" />
  <element value="jenny" />
  <element value="jayne" />  
</configuration>') AS XMlCol)

SELECT *
FROM VTE YT
WHERE EXISTS (SELECT 1
              FROM VTE E
                   CROSS APPLY E.XMlCol.nodes('configuration/element') C(E)
              WHERE E.ID = YT.ID
                AND C.E.value('./@value','varchar(50)') = 'lisa');

Возвращает только строку с идентификатором 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...