簡體   English   中英

在SQL Server XML數據類型上使用LIKE語句

[英]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並以VARCHAR()的形式返回您要查找的值
  • 在表上定義一個新的計算字段,該字段將調用此函數,並將其設為PERSISTED列

這樣,您基本上可以將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM