Подтвердить что ты не робот

Использовать инструкцию LIKE для SQL Server XML Тип данных

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

Как вы это делаете для типа XML?

У меня есть следующее, которое возвращает только строки с текстом node, но мне нужно искать в нем node

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

Ответ 1

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

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

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

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

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

При этом вы в основном "извлекаете" определенную часть XML в вычисленное поле, сохраняете его, а затем можете очень эффективно искать его (черт: вы можете даже индексировать это поле!).

Марк

Ответ 2

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

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

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

EDIT: Как говорит Клифф, вы можете использовать:

... nvarchar, если символы, которые не преобразуются в varchar

Ответ 3

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

SELECT * FROM
    (SELECT *, CONVERT(varchar(MAX), [COLUMNA]) as [XMLDataString] FROM TABLE) x
WHERE [XMLDataString] like '%Test%'

Ответ 4

Это то, что я собираюсь использовать, основываясь на ответе 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

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