Looping melalui nilai-nilai pengupasan 1 karakter sekaligus

10

Saya ingin mengulang nilai-nilai dan menghapus 1 karakter sekaligus dari nilai-nilai dan menampilkan hasilnya.

Jadi jika saya memiliki tabel dengan nilai:

ID
___
34679
13390
89906

Saya ingin hasilnya terlihat seperti ini

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

Jawaban:

19

Tolong jangan gunakan loop untuk hal-hal seperti ini (saya juga akan memesan CTE rekursif untuk skenario di mana Anda memiliki kontrol jauh lebih sedikit terhadap hal-hal, seperti hierarki). Loop buruk dalam SQL; SQL dioptimalkan untuk bekerja dalam 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);

Hasil:

9
79
679
4679
0
90
390
3390
6
06
906
9906
Aaron Bertrand
sumber
Terima kasih banyak atas bantuan Anda. ini persis apa yang saya coba capai.
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
sumber
2
Bisakah Anda memberikan penjelasan tentang cara kerja kode Anda? Itu akan membantu pengunjung masa depan.
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

HASIL:

4679 
679 
79 
9 
3390 
390 
90 
0 
9906 
906 
06 
6
Anish
sumber
1
Jadi, bagaimana Anda mengusulkan Anda melakukan ini, ketika ada banyak baris dalam tabel? Panggil prosedur - dalam satu lingkaran - untuk setiap baris? Sekarang Anda perlu kueri untuk menarik semua nilai-nilai itu, dan kemudian membuat kode untuk memanggil prosedur tersimpan untuk masing-masing nilai. Jadi, Anda memiliki loop untuk setiap baris dalam tabel yang memanggil prosedur yang menjalankan loop untuk setiap karakter di setiap nilai. Ini jelas bukan cara yang efisien untuk menyelesaikan masalah ini.
Aaron Bertrand
Terima kasih. Tapi, saya setuju dengan Aaron. Ini bukan yang saya inginkan. meja saya memiliki nilai lebih dari 300k. jadi ini tidak akan berhasil.
Kashif Qureshi