Scorrendo i valori rimuovendo 1 carattere alla volta


10

Voglio scorrere i valori e rimuovere 1 carattere alla volta dai valori e visualizzare il risultato.

Quindi se ho una tabella con valori:

ID
___
34679
13390
89906

Voglio che il risultato sia simile a questo

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

Risposte:


19

Per favore non usare i loop per cose del genere (riserverei anche CTE ricorsivi per scenari in cui hai molto meno controllo sulle cose, come le gerarchie). I loop non funzionano in SQL; SQL è ottimizzato per funzionare in set.

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);

risultati:

9
79
679
4679
0
90
390
3390
6
06
906
9906

Grazie per l'aiuto. questo è esattamente ciò che stavo cercando di ottenere.
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

2
Puoi fornire qualche spiegazione su come funziona il tuo codice? Ciò aiuterà i futuri visitatori.
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

EXEC:

EXEC udploop 34679 
EXEC udploop 13390 
EXEC udploop 89906

RISULTATO:

4679 
679 
79 
9 
3390 
390 
90 
0 
9906 
906 
06 
6

1
Quindi, come proponi di farlo, quando ci sono molte righe nella tabella? Chiamare la procedura - in un ciclo - per ogni riga? Ora hai bisogno di una query per estrarre tutti quei valori e quindi crea il codice per chiamare la procedura memorizzata per ognuno. Quindi hai un ciclo per ogni riga della tabella che chiama una procedura che esegue un ciclo per ogni carattere in ogni valore. Questo non è sicuramente un modo efficace per risolvere questo problema.
Aaron Bertrand

Grazie. Ma sono d'accordo con Aaron. Questo non è quello che volevo. la mia tabella ha più di 300k valori. quindi questo non funzionerà.
Kashif Qureshi,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.