[英]Use a LIKE statement on SQL Server XML Datatype
如果您有一個varchar字段,則可以輕松地從SELECT * FROM TABLE WHERE ColumnA LIKE '%Test%'
進行SELECT * FROM TABLE WHERE ColumnA LIKE '%Test%'
以查看該列是否包含某個字符串。
您如何針對XML類型執行此操作?
我有以下返回僅具有“文本”節點的行,但我需要在該節點內搜索
select * from WebPageContent where data.exist('/PageContent/Text') = 1
另一個選擇是將XML強制轉換為nvarchar,然后搜索給定的字符串,就像XML使用了nvarchar字段一樣。
SELECT *
FROM Table
WHERE CAST(Column as nvarchar(max)) LIKE '%TEST%'
我喜歡這個解決方案,因為它干凈,易於記憶,難以搞亂,並且可以用作where子句的一部分。
編輯:正如懸崖提到的那樣,您可以使用:
... nvarchar(如果某些字符不能轉換為varchar)
您應該能夠很容易地做到這一點:
SELECT *
FROM WebPageContent
WHERE data.value('(/PageContent/Text)[1]', 'varchar(100)') LIKE 'XYZ%'
.value
方法為您提供實際值,您可以定義該值作為VARCHAR()返回,然后可以使用LIKE語句進行檢查。
請注意,這不會太快。 因此,如果您的XML中有某些字段需要大量檢查,則可以:
這樣,您基本上可以將XML的特定部分“提取”到一個計算字段中,使其持久化,然后就可以非常高效地對其進行搜索(哎呀:您甚至可以索引該字段!)。
渣
另一種選擇是通過將XML轉換為字符串然后使用LIKE來搜索XML作為字符串。 但是,由於計算列不能成為WHERE子句的一部分,因此需要將其包裝在另一個SELECT中,如下所示:
SELECT * FROM
(SELECT *, CONVERT(varchar(MAX), [COLUMNA]) as [XMLDataString] FROM TABLE) x
WHERE [XMLDataString] like '%Test%'
這是我將基於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
在存在搜索條件的搜索中返回子字符串
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.