2014-08-30 5 views
-1

처음 나타나는 모든 문자열에서 번호를 가져 오는 것과 관련된 쿼리가 있습니다. 예를 들어문자열에서 숫자 부분 가져 오기

"10 Main Street"  would return 10 
"34 10 Main Street"  would return 3410 
" 34 10 Main Street" would return 3410 
" 34 - 10 Main Street" would return 34 

기능

ALTER FUNCTION [dbo].[GetNumeric] 
(@strAlphaNumeric nVARCHAR(Max)) 
RETURNS VARCHAR(256) 
AS 
BEGIN 
DECLARE @intAlpha INT 
SET @intAlpha = PATINDEX('%[^0-9]%', @strAlphaNumeric) 
BEGIN 
--WHILE @intAlpha > 0 
BEGIN 
SET @strAlphaNumeric = STUFF(@strAlphaNumeric, @intAlpha, 1, '') 
SET @intAlpha = PATINDEX('%[^0-9]%', @strAlphaNumeric) 
END 
END 
RETURN ISNULL(@strAlphaNumeric,0) 
END 

그러나이

select dbo.[GetNumeric](' 34 - 10 Main Street') 

결과가 정확한 답을 제공하지 않습니다 - 3410 // 여기

답변

1

잘못 인 것 같다 논리입니다 원하는 것을하기 위해서 :

declare @pattern varchar(8000) = 'asd 34-2 xx - 35 abc' 
declare @firstnum int; 

select @pattern = replace(@pattern, ' ', ''); 
select @firstnum = patindex('%[0-9]%', @pattern); 

select substring(@pattern, @firstnum, 
       patindex('%[^0-9]%', substring(@pattern, @firstnum, len(@pattern))) - 1 
       ); 

편집 :

문자열의 끝에서 숫자 문제를 해결하려면 : ('', '', @pattern를) = 대체

선택 @pattern; @firstnum = patindex ('% [0-9] %', @pattern)를 선택하십시오. @firstafternum = patindex ('% [^ 0-9] %', 부분 문자열 (@pattern, @firstnum, len (@pattern)) - 1을 선택하십시오.

select substring(@pattern, @firstnum, 
       (case when @firstafternum > 0 then @firstafternum 
         else len(@pattern) 
        end) 
       ); 
+1

고든 (Gordon)은 숫자가 문자열의 끝에있는 경우 (예 : "Main Street 3") 코드가 실패합니다. –

+0

@rsocol. . . 좋은 캐치. –

관련 문제