Recorriendo los valores eliminando 1 carácter a la vez

10

Quiero recorrer los valores y eliminar 1 carácter a la vez de los valores y mostrar el resultado.

Entonces, si tengo una tabla con valores:

ID
___
34679
13390
89906

Quiero que el resultado se vea así

Id
----
4679
679
79
9
3390
390
90
0
9906
906
06
6
Kashif Qureshi
fuente

Respuestas:

19

No use bucles para cosas como esta (también reservo CTE recursivos para escenarios en los que tiene mucho menos control sobre cosas, como jerarquías). Los bucles son malos en SQL; SQL está optimizado para trabajar en conjuntos.

DECLARE @foo TABLE(ID INT);

INSERT @foo VALUES(34679),(13390),(89906);

;WITH x AS 
(
  SELECT TOP (2048) n = ROW_NUMBER() OVER (ORDER BY Number)
  FROM master.dbo.spt_values ORDER BY Number
)
SELECT RIGHT(f.ID, x.n) FROM x
INNER JOIN @foo AS f
ON x.n < LEN(f.ID);

Resultados:

9
79
679
4679
0
90
390
3390
6
06
906
9906
Aaron Bertrand
fuente
Muchas gracias por su ayuda. Esto es exactamente lo que estaba tratando de lograr.
Kashif Qureshi
-1
declare @MyString varchar(500)

set MyString = '1,2.3#45.#,.6'

select dbo.RemoveChars(MyString, '#,.')

create function [dbo].[RemoveChars] (
    @InputString varchar(MAX)
    ,@CharsToRemove varchar(500)
    )
returns varchar(MAX)
as
begin
    declare @len int
        ,@Counter int
        ,@OneChar char(1)

    set @Counter = 1
    set @len = LEN(@CharsToRemove);

    while (1 = 1)
    begin
        set @OneChar = SUBSTRING(@CharsToRemove, @Counter, 1)
        set @InputString = REPLACE(@InputString, @OneChar, '')
        set @Counter = @Counter + 1

        if (
                @Counter > @len
                or @Counter > 20
                )
            break;
    end

    return @InputString
end
Eyad
fuente
2
¿Puedes dar alguna explicación sobre cómo funciona tu código? Eso ayudará a los futuros visitantes.
Kin Shah
-3
CREATE PROC udploop (@num varchar(10))
AS
       BEGIN 
             DECLARE @len int; 
             SET @len = LEN(@num); 
             WHILE (@len > 1)
                   BEGIN    
                         SELECT
                            @num = RIGHT(@num, @len - 1); 
                         PRINT @num;
                         SET @len = LEN(@num);
                   END 
       END

EJECUTAR:

EXEC udploop 34679 
EXEC udploop 13390 
EXEC udploop 89906

RESULTADO:

4679 
679 
79 
9 
3390 
390 
90 
0 
9906 
906 
06 
6
Anish
fuente
1
Entonces, ¿cómo propones hacer esto, cuando hay muchas filas en la tabla? Llame al procedimiento, en un bucle, para cada fila? Ahora necesita una consulta para extraer todos esos valores, y luego crea el código para llamar al procedimiento almacenado para cada uno. Entonces tiene un ciclo para cada fila de la tabla que llama a un procedimiento que ejecuta un ciclo para cada carácter en cada valor. Definitivamente, esta no es una forma eficiente de resolver este problema.
Aaron Bertrand
Gracias. Pero estoy de acuerdo con Aaron. Esto no es lo que quería. mi tabla tiene más de 300k valores. entonces esto no funcionará.
Kashif Qureshi