programing tip

SQL Server XML 데이터 형식에서 LIKE 문 사용

itbloger 2020. 10. 19. 07:50
반응형

SQL Server XML 데이터 형식에서 LIKE 문 사용


varchar 필드가있는 SELECT * FROM TABLE WHERE ColumnA LIKE '%Test%'경우 해당 열에 특정 문자열이 포함되어 있는지 쉽게 확인할 수 있습니다 .

XML 유형에 대해 어떻게 수행합니까?

'텍스트'노드가있는 행만 반환하는 다음이 있지만 해당 노드 내에서 검색해야합니다.

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을 가져오고 찾고있는 값을 VARCHAR ()로 반환하는 저장된 함수를 만듭니다.
  • 이 함수를 호출하는 테이블에 새 계산 필드를 정의하고 PERSISTED 열로 만듭니다.

이를 통해 기본적으로 XML의 특정 부분을 계산 된 필드로 "추출"하고 지속되도록 만든 다음이를 매우 효율적으로 검색 할 수 있습니다 (해당 필드를 INDEX 할 수도 있습니다!).

마크


또 다른 옵션은 XML을 nvarchar로 캐스팅 한 다음 XML vas가 nvarchar 필드 인 것처럼 주어진 문자열을 검색하는 것입니다.

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

이 솔루션은 깨끗하고 기억하기 쉬우 며 엉망이되기 어렵고 where 절의 일부로 사용할 수 있으므로이 솔루션을 좋아합니다.

편집 : Cliff가 언급했듯이 다음을 사용할 수 있습니다.

... varchar로 변환되지 않는 문자가있는 경우 nvarchar


또 다른 옵션은 XML을 문자열로 변환 한 다음 LIKE를 사용하여 문자열로 검색하는 것입니다. 그러나 계산 된 열은 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

검색 기준이있는 검색에서 하위 문자열을 반환합니다.

참고 URL : https://stackoverflow.com/questions/1832987/use-a-like-statement-on-sql-server-xml-datatype

반응형