Durchlaufen von Werten, bei denen jeweils 1 Zeichen entfernt wird

10

Ich möchte Werte durchlaufen und jeweils 1 Zeichen von den Werten entfernen und das Ergebnis anzeigen.

Wenn ich also eine Tabelle mit Werten habe:

ID
___
34679
13390
89906

Ich möchte, dass das Ergebnis so aussieht

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

Antworten:

19

Bitte verwenden Sie für solche Dinge keine Schleifen (ich würde auch rekursive CTEs für Szenarien reservieren, in denen Sie viel weniger Kontrolle über Dinge wie Hierarchien haben). Schleifen sind in SQL schlecht; SQL ist für die Arbeit in Gruppen optimiert.

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

Ergebnisse:

9
79
679
4679
0
90
390
3390
6
06
906
9906
Aaron Bertrand
quelle
Vielen Dank für Ihre Hilfe. Genau das wollte ich erreichen.
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
quelle
2
Können Sie erklären, wie Ihr Code funktioniert? Das wird zukünftigen Besuchern helfen.
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

ERGEBNIS:

4679 
679 
79 
9 
3390 
390 
90 
0 
9906 
906 
06 
6
Anish
quelle
1
Wie schlagen Sie dies vor, wenn die Tabelle viele Zeilen enthält? Die Prozedur - in einer Schleife - für jede Zeile aufrufen? Jetzt benötigen Sie eine Abfrage, um alle diese Werte abzurufen, und erstellen dann den Code zum Aufrufen der gespeicherten Prozedur für jeden einzelnen. Sie haben also eine Schleife für jede Zeile in der Tabelle, die eine Prozedur aufruft, die selbst eine Schleife für jedes Zeichen in jedem Wert ausführt. Dies ist definitiv kein effizienter Weg, um dieses Problem zu lösen.
Aaron Bertrand
Vielen Dank. Aber ich stimme Aaron zu. Das wollte ich nicht. Meine Tabelle hat mehr als 300k Werte. Das wird also nicht funktionieren.
Kashif Qureshi