Используйте инструкцию LIKE для типа данных SQL Server XML - PullRequest
69 голосов
/ 02 декабря 2009

Если у вас есть поле varchar, вы можете легко набрать SELECT * FROM TABLE WHERE ColumnA LIKE '%Test%', чтобы увидеть, содержит ли этот столбец определенную строку.

Как это сделать для XML Type?

У меня есть следующее, которое возвращает только строки, которые имеют узел «Текст», но мне нужно искать в этом узле

select * from WebPageContent where data.exist('/PageContent/Text') = 1

Ответы [ 4 ]

65 голосов
/ 02 декабря 2009

Вы должны быть в состоянии сделать это довольно легко:

SELECT * 
FROM WebPageContent 
WHERE data.value('(/PageContent/Text)[1]', 'varchar(100)') LIKE 'XYZ%'

Метод .value дает вам фактическое значение, и вы можете определить его как VARCHAR (), которое затем можно проверить с помощью оператора LIKE.

Имейте в виду, это не будет очень быстро. Поэтому, если у вас есть определенные поля в вашем XML, которые вам нужно много проверять, вы можете:

  • создать хранимую функцию, которая получает XML и возвращает искомое значение как VARCHAR ()
  • определить новое вычисляемое поле в вашей таблице, которое вызывает эту функцию, и сделать его столбцом PERSISTED

При этом вы, в основном, «извлекаете» определенную часть XML в вычисляемое поле, сохраняете его, а затем можете очень эффективно выполнять поиск по нему (черт возьми: вы даже можете УКАЗАТЬ это поле!) 1015 *

Марк

57 голосов
/ 14 апреля 2016

Еще один вариант - привести XML как nvarchar, а затем найти заданную строку, как если бы XML был полем nvarchar.

SELECT * 
FROM Table
WHERE CAST(Column as nvarchar(max)) LIKE '%TEST%'

Мне нравится это решение, потому что оно чистое, легко запоминающееся, сложно запутаться и может использоваться как часть предложения where.

РЕДАКТИРОВАТЬ: Как упоминает Клифф, вы можете использовать:

... nvarchar, если есть символы, которые не конвертируются в varchar

10 голосов
/ 04 июня 2014

Другим вариантом является поиск XML в виде строки путем преобразования его в строку и последующего использования LIKE. Однако, поскольку вычисляемый столбец не может быть частью предложения WHERE, вам нужно заключить его в другой элемент SELECT следующим образом:

SELECT * FROM
    (SELECT *, CONVERT(varchar(MAX), [COLUMNA]) as [XMLDataString] FROM TABLE) x
WHERE [XMLDataString] like '%Test%'
0 голосов
/ 02 декабря 2009

Это то, что я собираюсь использовать, основываясь на ответе marc_s:

SELECT 
SUBSTRING(DATA.value('(/PAGECONTENT/TEXT)[1]', 'VARCHAR(100)'),PATINDEX('%NORTH%',DATA.value('(/PAGECONTENT/TEXT)[1]', 'VARCHAR(100)')) - 20,999)

FROM WEBPAGECONTENT 
WHERE COALESCE(PATINDEX('%NORTH%',DATA.value('(/PAGECONTENT/TEXT)[1]', 'VARCHAR(100)')),0) > 0

Возвращает подстроку в поиске, где существуют критерии поиска

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