varcharフィールドがある場合SELECT * FROM TABLE WHERE ColumnA LIKE '%Test%'
は、その列に特定の文字列が含まれているかどうかを簡単に確認できます。
XMLタイプに対してどのようにそれを行いますか?
'Text'ノードを持つ行のみを返す次のものがありますが、そのノード内を検索する必要があります
select * from WebPageContent where data.exist('/PageContent/Text') = 1
回答:
これは非常に簡単に実行できるはずです。
SELECT *
FROM WebPageContent
WHERE data.value('(/PageContent/Text)[1]', 'varchar(100)') LIKE 'XYZ%'
この.value
メソッドは実際の値を提供し、それをVARCHAR()として返すように定義できます。これは、LIKEステートメントで確認できます。
気をつけてください、これはひどく速くなることはないでしょう。したがって、XMLに多くの検査が必要な特定のフィールドがある場合は、次のことができます。
これにより、基本的にXMLの特定の部分を計算フィールドに「抽出」し、それを永続化して、非常に効率的に検索できます(つまり、そのフィールドにインデックスを付けることもできます)。
マーク
さらに別のオプションは、XMLをnvarcharとしてキャストし、XMLがnvarcharフィールドを介しているかのように指定された文字列を検索することです。
SELECT *
FROM Table
WHERE CAST(Column as nvarchar(max)) LIKE '%TEST%'
このソリューションは、クリーンで覚えやすく、混乱しにくく、where句の一部として使用できるため、気に入っています。
編集:クリフがそれを述べているように、あなたは使うことができます:
... varcharに変換されない文字がある場合はnvarchar
もう1つのオプションは、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
検索条件が存在する検索で部分文字列を返します