[SQL] SQL Server의 텍스트에서 추출 번호
SQLSQL Server의 텍스트에서 추출 번호
난 SQL Server의 텍스트에서 추출 수에 스크립트를 검색하고 있었고, 난 이걸 발견
CREATE FUNCTION [dbo].[GetNumbersFromText](@String VARCHAR(2000))
RETURNS @Number TABLE (Number INT)
AS
BEGIN
DECLARE @Count INT
DECLARE @IntNumbers VARCHAR(1000)
SET @Count = 0
SET @IntNumbers = ''
WHILE @Count <= LEN(@String)
BEGIN
--Find a numeric charactor
IF SUBSTRING(@String,@Count,1) >= '0' AND SUBSTRING(@String,@Count,1) <= '9'
BEGIN
SET @IntNumbers = @IntNumbers + SUBSTRING(@String,@Count,1)
END
--If the next charactor is not a numeric one, the current number ends, so add a separator
IF (SUBSTRING(@String,@Count+1,1) < '0'OR SUBSTRING(@String,@Count+1,1) > '9') AND SUBSTRING(@String,@Count,1) >= '0' AND SUBSTRING(@String,@Count,1) <= '9'
BEGIN
SET @IntNumbers = @IntNumbers + ','
END
SET @Count = @Count + 1
END
---Split string to give a table with the numbers in the text
INSERT INTO @Number
SELECT DISTINCT items FROM dbo.Split(@IntNumbers, ',')
return
END
와 같이 호출
SELECT Number FROM Dbo.[GetNumbersFromText]('Give me 120 this week and 50 next week')
그것을 잘 작동하지만 난 더 짧은 코드가 필요합니다. 나는 텍스트에서 추출 수에 PATINDEX를 사용할 수 있습니다. 누구 점유율 작은 및 좋은 논리는 그렇게 할 바랍니다. 감사
해결법
-
==============================
1.이것은 조금 짧습니다. 숫자를 찾기 위해 재귀 CTE를 사용하는 인라인 테이블 함수로를 돌렸다.
이것은 조금 짧습니다. 숫자를 찾기 위해 재귀 CTE를 사용하는 인라인 테이블 함수로를 돌렸다.
create function [dbo].[GetNumbersFromText](@String varchar(2000)) returns table as return ( with C as ( select cast(substring(S.Value, S1.Pos, S2.L) as int) as Number, stuff(s.Value, 1, S1.Pos + S2.L, '') as Value from (select @String+' ') as S(Value) cross apply (select patindex('%[0-9]%', S.Value)) as S1(Pos) cross apply (select patindex('%[^0-9]%', stuff(S.Value, 1, S1.Pos, ''))) as S2(L) union all select cast(substring(S.Value, S1.Pos, S2.L) as int), stuff(S.Value, 1, S1.Pos + S2.L, '') from C as S cross apply (select patindex('%[0-9]%', S.Value)) as S1(Pos) cross apply (select patindex('%[^0-9]%', stuff(S.Value, 1, S1.Pos, ''))) as S2(L) where patindex('%[0-9]%', S.Value) > 0 ) select Number from C )
당신이 문자열에 100 개 이상의 번호를 기대하는 경우는 옵션 (MAXRECURSION 0)을 호출해야합니다.
declare @S varchar(max) set @S = 'Give me 120 this week and 50 next week' select number from GetNumbersFromText(@S) option (maxrecursion 0)
-
==============================
2.@ 비 크람의 기본적인 아이디어는 나쁘지는 않지만 자신의 쿼리는 하나의 항목으로 모든 숫자를 반환합니다. 소스 문자열에서 발견 다음 함수는 별도의 번호가 포함 된 테이블을 리턴합니다 :
@ 비 크람의 기본적인 아이디어는 나쁘지는 않지만 자신의 쿼리는 하나의 항목으로 모든 숫자를 반환합니다. 소스 문자열에서 발견 다음 함수는 별도의 번호가 포함 된 테이블을 리턴합니다 :
CREATE FUNCTION dbo.GetNumbersFromText (@String varchar(2000)) RETURNS TABLE AS RETURN ( WITH NumbersSplit AS ( SELECT C = SUBSTRING(@String, number, 1), i = number, g = number - ROW_NUMBER() OVER (ORDER BY number) FROM master..spt_values WHERE type = 'P' AND SUBSTRING(@String, number, 1) BETWEEN '0' AND '9' ), NumbersAssembled AS ( SELECT number = CAST( (SELECT C + '' FROM NumbersSplit WHERE g = g.g ORDER BY i FOR XML PATH ('')) AS varchar(2000) ) FROM NumbersSplit g GROUP BY g ) SELECT * FROM NumbersAssembled )
참고 :이 솔루션은 SQL Server 2005 또는 이후 버전에서 작동합니다.
-
==============================
3.다음과 같은 논리를보십시오 :
다음과 같은 논리를보십시오 :
declare @thestring varchar(50) set @thestring = 'Give me 120 this week and 50 next week' declare @final varchar(50) set @final = '' select @final = @final + x.thenum from ( select substring(@thestring, number, 1) as thenum, number from master..spt_values where substring(@thestring, number, 1) like '[0-9]' and type='P' ) x order by x.number print @final
-
==============================
4.-이 코드를 사용해보십시오 ... -- 괜찮아!!!
-이 코드를 사용해보십시오 ... -- 괜찮아!!!
CREATE FUNCTION [dbo].[udf_ExtractNumberFromString] ( @pInputString VARCHAR(MAX) ) RETURNS VARCHAR(MAX) AS BEGIN DECLARE @OutputString varchar(MAX)='' DECLARE @string varchar(MAX) DECLARE @start INT DECLARE @end INT DECLARE @len INT SET @string=@pInputString --SET @string = 'the22478ddffafghrty12345TestAddressdd5aa789324-#345' SET @string = replace(@string, ' ' , '') WHILE PATINDEX('%[0-9]%',@string) <> 0 BEGIN SET @len = len(@string) -- PRINT @len set @start = PATINDEX('%[0-9]%',@string) -- PRINT @start SET @end= PATINDEX('%[^0-9]%',SUBSTRING(@string,@start,@len-@start)) -- PRINT @end IF @end=0 BEGIN SET @end=@len-@start SET @OutputString=SUBSTRING(@string,@start,@end+1)+'-'+@OutputString BREAK END ELSE BEGIN SET @OutputString=SUBSTRING(@string,@start,@end-1)+'-'+@OutputString SET @string=SUBSTRING(@string,@end+@start-1,@len-@end) END --PRINT @string --PRINT @Output --PRINT '---------------------' END IF LEN(@OutputString)>0 SET @OutputString=LEFT(@OutputString,LEN(@OutputString)-1) --PRINT @OutputString RETURN @OutputString END
-
==============================
5.다음은이 쿼리에 대한 적절하고 작업 솔루션입니다
다음은이 쿼리에 대한 적절하고 작업 솔루션입니다
http://www.ittutorials.in/source/sql/sql-function-to-extract-only-numbers-from-string.aspx
from https://stackoverflow.com/questions/9629880/extract-numbers-from-a-text-in-sql-server by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게 SELECT 쿼리에서 열을 제외하려면? (0) | 2020.06.16 |
---|---|
[SQL] SQL 주입을 감지하는 정규 표현식 (0) | 2020.06.16 |
[SQL] 합니까 MS 액세스 (2003) 저장 프로 시저에 비해 아무것도. 나는 MS의 acceess에서 복잡한 쿼리를 실행하려면 (0) | 2020.06.16 |
[SQL] PostgreSQL의에서 소수점 후 비 제로 레코드를 가져 오기 (0) | 2020.06.16 |
[SQL] 최대 값을 기준으로 행을 삭제 (0) | 2020.06.16 |