2010-03-10 2 views
1

Regex에 대해 많이 알지는 않습니다. 흐르는 지침에 따라 데이터베이스에서 스팅을 파싱하려고합니다. 내가 CLR을 사용하지만 테이블이MS SQL의 Regex 표현

create table #tempTBL (opis varchar(40)) 
go 
insert into #tempTBL 
select 'C 136' 
union 
select 'C 145' 
union 
select 'C146' 
union 
select 'AK C 182' 
union 
select 'C 277' 
union 
select 'C-240' 
union 
select 'ISPRAVKA PO C 241' 

처럼 그리고해야의 모습을 어떻게

Select 
    reverse(
      rtrim(
        ltrim(
          replace(
            (substring 
              (reverse(opis) 
                ,0 
                ,charindex(
                   'C',reverse(opis) 
                   ) 
              ) 
            ) 
          ,'-',' ') 
         ) 
       ) 
      ) as jci 
from #tempTBL 

같은 선택 찌르기 보이는에서 정규식

데이터를 배우려는 시작에 대한 필요가 알리라 내 C# 코드를 정규식을 사용하여 이것을 반복합니다

답변

1

CLR 어셈블리를 빌드하여이 특정 요구 사항을 충족하는 정규식을 적용하는 대신 범용 정규식 CLR 함수를 만드는 것이 좋습니다.

이 밖으로 많은 예제가 있지만 this article는 좋은 어떤

EDIT로 시작하는 곳입니다 당신의 예는 데이터의 가능한 구성의 전체 범위, 당신은 할 수있다 필요로하는 정규 표현식을 포함하는 경우 (\d+)과 같이 간단합니다 (하나 이상의 연속 된 숫자가 일치 그룹으로 반환됨을 의미).

1

article을 참조하십시오. 단순히 sqlserver에 .NET 함수를 추가하고 쿼리에서 sqlserver 함수로 호출하기 만하면됩니다.

1

CLR 정규식을 사용하면 다소 느려질 수 있습니다. 예제 에서처럼 변환이 쉬운 경우 간단한 SQL을 사용하는 것이 좋습니다.

PATINDEX 기능을 살펴보면 유용 할 수 있습니다. 또한 명확성을 위해 추출을 UDF로 캡슐화하는 것이 좋습니다.

create function dbo.ParseNum(@s varchar(40)) returns char(3) 
as begin 
    declare @n int 
    set @s = replace(replace(@s, '-', ''), ' ', '') 
    set @n = patindex('%C[0-9][0-9][0-9]', @s) 
    if @n = 0 return null 
    return substring(@s, @n+1, 3) 
end 
go 

select opis, dbo.ParseNum(opis) from #tempTBL