2012-03-09 10 views
8

ero alla ricerca script per estrarre il numero di testo in SQL server e ho trovato questonumeri estratto da un testo in 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 

e lo chiamo come

SELECT Number FROM Dbo.[GetNumbersFromText]('Give me 120 this week and 50 next week') 

funziona benissimo ma ho bisogno di più codice corto posso usare patindex per estrarre il numero dal testo. per favore chiunque condivida la piccola & buona logica per farlo. grazie

+0

Perché avete bisogno "codice più corto" e "piccola logica"? Se la tua funzione funziona correttamente e funziona in modo accettabile, non c'è alcun motivo per cambiarla. – Pondlife

risposta

6

Questo è un po 'più breve. Trasformato in Inline Table Function che utilizza un CTE ricorsivo per trovare i numeri.

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 
) 

Se vi aspettate di avere più di 100 numeri nella stringa è necessario chiamare con option (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

provare la seguente logica:

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 
3

@ idea di base di Vikram non è male, ma la loro interrogazione restituisce tutti i numeri come un unico elemento. La seguente funzione restituisce una tabella contenente i numeri separati come si trova nella stringa di origine:

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 
) 

Nota: questa soluzione potrebbe funzionare in SQL Server 2005 o versioni successive.

0

- provare questo codice ... - Il suo OK !!!


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 @[email protected] 
    --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,@[email protected])) 
    -- PRINT @end 

     IF @end=0 
      BEGIN 
       SET @[email protected]@start 
       SET @OutputString=SUBSTRING(@string,@start,@end+1)+'-'[email protected] 
       BREAK 
      END 
     ELSE 
      BEGIN 
       SET @OutputString=SUBSTRING(@string,@start,@end-1)+'-'[email protected] 
       SET @string=SUBSTRING(@string,@[email protected],@[email protected]) 
      END 

     --PRINT @string 

     --PRINT @Output 
     --PRINT '---------------------' 
    END 

    IF LEN(@OutputString)>0 
     SET @OutputString=LEFT(@OutputString,LEN(@OutputString)-1) 
    --PRINT @OutputString 

    RETURN @OutputString 
END