遍历值一次剥离1个字符


Answers:


19

请不要对这样的事情使用循环(我也将递归CTE保留给您对事物(例如层次结构)的控制要少得多的场景。循环在SQL中是不好的。SQL已优化为可按集合工作。

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

结果:

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

感谢分配给您的帮助。这正是我想要实现的目标。
Kashif Qureshi 2014年

-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
您能否提供一些有关代码工作方式的解释?这将对未来的访客有所帮助。
金莎(Kin Shah)2015年

-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 udploop 34679 
EXEC udploop 13390 
EXEC udploop 89906

结果:

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

1
那么,当表中有很多行时,您如何建议您这样做呢?为每一行调用该过程-循环-吗?现在,您需要一个查询以提取所有这些值,然后创建代码以调用每个值的存储过程。因此,表中的每一行都有一个循环,该循环调用一个过程,该过程本身为每个值中的每个字符运行一个循环。这绝对不是解决此问题的有效方法。
亚伦·伯特兰

谢谢。但是,我同意亚伦。这不是我想要的。我的表有超过300k的值。所以这行不通。
Kashif Qureshi 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.