복붙노트

[SQL] SQL Server의 텍스트에서 추출 번호

SQL

SQL 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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    5.다음은이 쿼리에 대한 적절하고 작업 솔루션입니다

    다음은이 쿼리에 대한 적절하고 작업 솔루션입니다

    http://www.ittutorials.in/source/sql/sql-function-to-extract-only-numbers-from-string.aspx

  6. from https://stackoverflow.com/questions/9629880/extract-numbers-from-a-text-in-sql-server by cc-by-sa and MIT license