2012-03-09 22 views
8

yo estaba buscando secuencia de comandos para extraer el número de texto en el servidor SQL y me encontré con estenúmeros extracto de un texto en 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 

y lo llaman como

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

funciona bien, pero me necesita más código corto. ¿Puedo usar patindex para extraer el número del texto? por favor cualquier persona comparte pequeño & buena lógica para hacerlo. gracias

+0

¿Por qué necesita "código corto" y "pequeña lógica"? Si su función funciona correctamente y funciona de manera aceptable, entonces no hay ninguna razón para cambiarla. – Pondlife

Respuesta

6

Esto es un poco más corto. Se convirtió en la función de tabla en línea que utiliza un CTE recursivo para encontrar los números.

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 
) 

Si usted espera tener más de 100 números en la cadena que necesita llamar 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

tratar la siguiente lógica:

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 básica de Vikram no es malo, pero su consulta devolvería todos los números como un único elemento. La siguiente función devuelve una tabla que contiene los números separados como se encuentra en la cadena de origen:

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: esta solución sería trabajar en SQL Server 2005 o posterior.

0

- Intente esto ... Código - No está mal !!!


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 
Cuestiones relacionadas