2009-10-30 18 views
0

SQL 쿼리 결과에서 부분 문자열을 추출하는 데 문제가 있습니다. 여기 SQL 추출 부분 문자열

상황이다 : 나는 숫자 문자열을 추출 할 필요가 다음과 같은 형식으로 "ax123456uhba", "ax54232hrg", "ax274895rt", "ax938477ed1", "ax73662633wnn2"

문자열을 포함하는 열이 그 앞에 문자가옵니다. 그러나 때로는 후행 문자열에 필요하지 않은 숫자가 있습니다. 후행 문자의 길이는 정적이 아니므로 간단한 하위 문자열 기능 만 수행 할 수는 없습니다.

필자는 완성 된 코드를 요구하는 것이 아니라 가능하면 올바른 방향으로 도움이되는 내용을 요구합니다.

미리 도움을 주셔서 감사합니다.

+0

이 하위 문자열을 SQL 또는 .NET으로 처리하고 있습니까? –

+0

SQL을 그대로 사용하십시오. .NET은 가능성의 범위를 벗어나지 않습니다. –

답변

3

는 당신이 필요로하는 것입니다.

는 문자열에있는 패턴의 첫 번째 인덱스를 돌려줍니다 예상 정규 표현식 ->http://blog.sqlauthority.com/2007/05/13/sql-server-udf-function-to-parse-alphanumeric-characters-from-string/

다음은 문자열에서 숫자 문자를 제거하려면 여기를 복사 한 코드입니다 - 그것은 문자열에서 숫자의 첫번째 연속 시리즈를 제거하려면이 옵션을 변경하는 데 시간이 너무 오래 걸리지 않을 겁니다.

CREATE FUNCTION dbo.UDF_ParseAlphaChars 
(
@string VARCHAR(8000) 
) 
RETURNS VARCHAR(8000) 
AS 
BEGIN 
    DECLARE @IncorrectCharLoc SMALLINT 
    SET @IncorrectCharLoc = PATINDEX('%[^0-9A-Za-z]%', @string) 

    WHILE @IncorrectCharLoc > 0 
    BEGIN 
     SET @string = STUFF(@string, @IncorrectCharLoc, 1, '') 
     SET @IncorrectCharLoc = PATINDEX('%[^0-9A-Za-z]%', @string) 
    END 

    SET @string = @string 

    RETURN @string 
END 
GO 
+0

우수 발견! 대단히 감사합니다! –

+0

기록을 위해이 UDF는 모든 문자를 제거합니다. 그것은 "a9d1"을 91로 변환합니다. – Andomar

0

는 .NET을 사용하는 경우 정규식을 사용하여 잡아 수 :

var input = "ax938477ed1"; 
var reg = new Regex("[0-9]+"); 
var match = reg.Match(input); 
int number = -1; 
if (match.Success) 
    number = Convert.ToInt32(match.Groups[0].Value); 

이 번호 938477를 저장합니다.

0

아마도 정규식을 사용하는 것이 가장 쉽습니다.

데이터베이스에 따라 다름 - 일부 정규식 기능을 가지고 - 그것은 Untested MSDN article

그렇지 않으면 당신은 같이 사용하여 쿼리를 줄일 수있는 서버에 추가 할 수 있습니다 (같은 SQL 서버 보인다베이스는 여기서 x '%의 [같은 수 있습니다. 그 다음 클라이언트에서 정규식을 사용] & '0-9 숫자로 행을 찾을 수 있습니다.

그것은 PATINDEX처럼 보이는
0

CLR을 사용할 수있는 SQL 2005 또는 2008을 사용 중이라고 가정하고 RegEx를 사용하는 것에 동의합니다. 다음은 SQL Server에서 RegEx를 사용하여 도움이 될만한 UDF 코드입니다.

Imports System 
Imports System.Data 
Imports System.Data.SqlClient 
Imports System.Data.SqlTypes 
Imports System.Text 
Imports System.Text.RegularExpressions 
Imports Microsoft.SqlServer.Server 

Partial Public Class UserDefinedFunctions 

    <Microsoft.SqlServer.Server.SqlFunction()> 
    Public Shared Function IsRegexMatch(ByVal input As SqlString, ByVal pattern As SqlString) As SqlBoolean 
     If input.IsNull OrElse pattern.IsNull Then Return SqlBoolean.Null 
     Return Regex.IsMatch(input.Value, pattern.Value, RegexOptions.IgnorePatternWhitespace Or RegexOptions.Singleline Or RegexOptions.Multiline) 
    End Function 

    <Microsoft.SqlServer.Server.SqlFunction()> 
    Public Shared Function RegexReplace(ByVal input As SqlString, ByVal pattern As SqlString, ByVal replacement As SqlString) As SqlString 
     If input.IsNull OrElse pattern.IsNull OrElse replacement.IsNull Then Return SqlString.Null 
     Return Regex.Replace(input.Value, pattern.Value, replacement.Value, RegexOptions.IgnorePatternWhitespace Or RegexOptions.Singleline Or RegexOptions.Multiline) 
    End Function 
End Class