2010-07-15 3 views
7

정규식을 함수 (MSSQL) 내에서 LIKE로 변환하는 좋은 방법이 있습니까? 의 sproc이보다 복잡하지 않습니다Sql이 (가) RegEx를 좋아합니다

(country\=)(?<Country>[\w\d]+)(\&sessionid\=)(?<SessionId>.+) 

그룹은 LIKE 사용되지 않습니다, 그들은 또 다른 목적이있다.

내가 좋아하는 늦게 sproc에 내부 이것을 사용하고 싶습니다 : 정규식 [표]

+1

달성하려는 작업은 무엇입니까? 규칙이 정규 표현식으로 표현되는 일종의 테이블 기반 디스패치 메커니즘? ... 내가 정확하게 추측하면 궁금해서. –

+0

로그 파일의 구문 분석을 가정합니다. 쿼리 문자열처럼 보입니다. –

+0

Tomek이 맞습니다 :) – Andreas

답변

4

CLR 함수를 사용하여 SQL Server에 정규식 구문 분석을 추가 할 수 있습니다. 이것은 SQL 2005 이상에서 가능합니다. 좋은 예를 들면 here을보십시오.

+0

마지막으로 답변을 얻었으므로 제대로 작동해야합니다 .. 감사합니다. 그리고 귀하의 대답은 내 질문에 대답하지 않지만, 내 문제를 해결 .. 그래서 내가 해결 표시 :) – Andreas

+1

이 링크가 질문에 대한 답변 수도 있지만, 그것은 여기에 답변의 필수 부분을 포함하는 것이 좋습니다 참조 용 링크. 링크 된 페이지가 변경되면 링크 전용 답변이 유효하지 않게 될 수 있습니다. – Moes

3

확인 SQL의 기능의 일부입니다

SELECT * FROM [Table] 
WHERE test_regex(regex, 'text') = 1 

합니다. 그것은 당신이 당신의 작업을 달성하는 데 도움이 될 수 있습니다 : PATINDEX('%[^0-9\.]%',@Input)

PATINDEX (Transact-SQL)

+0

regex : s "+"또는 "*"와 같이 여러 표현식 인스턴스를 함수에 알릴 수있는 방법이 있습니까? 예를 들어 PATINDEX ('% [a-c] + %', @ Input) – Andreas

+0

아니요. 가능하다고 생각하지 않습니다. –

1

을하지 상자 밖으로. SQL Server에서 정규식 검색에 가장 가까운 것은 PATINDEX()이지만 정규 표현식을 사용하지는 않습니다.

정말로 이것을 원하면 정규식을 실행하는 CLR 함수를 만들어야합니다. 스피드에 대해 걱정할 수도 있지만, 어쨌든 정규 표현식이나 패턴을 염두에두고 할 일은 거의 없다고 말할 수 있습니다.

2

큰 테이블에서 매우 느리게 실행되어 각 행마다 문자열 열을 구문 분석합니다.

테이블을 변경할 수 있다면 문자열 열을 다른 열로 나누는 것이 더 좋을 수 있으므로 더 일반적인 WHERE country=... AND sessionid=...을 가질 수 있습니다.이 방법으로 인덱스를 추가하고 사용할 수도 있습니다.

4

나는

SELECT ... 
FROM [Table] 
WHERE col LIKE 'country=[A-Za-z0-9]%&sessionid=[A-Za-z0-9]%' 

가 충분히 가까이있을 치지? 비어있는 국가 및 세션 ID 값을 가진 레코드를 가져 오는 것일뿐입니다.

열의 값이 반드시 'country'로 시작하지 않으면 WHERE col LIKE '%country=[A-Za-z0-9]%&sessionid=[A-Za-z0-9]%'을 사용해야하며 KM의 답변에 따라 작업 속도가 상당히 느려질 수 있습니다.

1

무료 인 SQL# 내의 RegEx 기능을 사용하십시오. 이 접근 방식에 성능 문제가 없었습니다.