Xoay vòng qua các giá trị tước 1 ký tự một lần


10

Tôi muốn lặp qua các giá trị và loại bỏ 1 ký tự một lần từ các giá trị và hiển thị kết quả.

Vì vậy, nếu tôi có một bảng với các giá trị:

ID
___
34679
13390
89906

Tôi muốn kết quả như thế này

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

Câu trả lời:


19

Vui lòng không sử dụng các vòng lặp cho những thứ như thế này (Tôi cũng dự trữ các CTE đệ quy cho các tình huống mà bạn có ít quyền kiểm soát hơn đối với mọi thứ, như phân cấp). Vòng lặp là xấu trong SQL; SQL được tối ưu hóa để làm việc theo bộ.

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

Các kết quả:

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

Cảm ơn sự giúp đỡ của bạn. đây chính xác là những gì tôi đã cố gắng để đạt được.
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
Bạn có thể cung cấp một số giải thích về cách mã của bạn hoạt động? Điều đó sẽ giúp du khách trong tương lai.
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

KẾT QUẢ:

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

1
Vậy làm thế nào để bạn đề xuất bạn làm điều này, khi có nhiều hàng trong bảng? Gọi thủ tục - trong một vòng lặp - cho mỗi hàng? Bây giờ bạn cần một truy vấn để kéo tất cả các giá trị đó, rồi tạo mã để gọi thủ tục được lưu trữ cho mỗi giá trị. Vì vậy, bạn có một vòng lặp cho mỗi hàng trong bảng gọi một thủ tục tự chạy một vòng lặp cho mỗi ký tự trong mỗi giá trị. Đây chắc chắn không phải là một cách hiệu quả để giải quyết vấn đề này.
Aaron Bertrand

cảm ơn. Nhưng, tôi đồng ý với Aaron. Đây không phải là những gì tôi muốn. bảng của tôi có hơn 300k giá trị. vì vậy điều này sẽ không hoạt động.
Kashif Qureshi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.