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
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:
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
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
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