한 번에 1 문자를 제거하는 값을 반복


10

값을 반복하고 값에서 한 번에 1 문자를 제거하고 결과를 표시하고 싶습니다.

그래서 값이있는 테이블이 있다면 :

ID
___
34679
13390
89906

결과가 다음과 같이 보이기를 원합니다.

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

답변:


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

도와 주셔서 감사합니다. 이것은 내가 달성하려고했던 것입니다.
카 시프 쿠 레시

-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

-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

결과:

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

1
그렇다면 테이블에 많은 행이있을 때 어떻게 제안합니까? 모든 행에 대해 루프에서 프로 시저를 호출 하시겠습니까? 이제 이러한 값을 모두 가져 오는 쿼리가 필요하며 각 값에 대해 저장 프로 시저를 호출하는 코드를 만듭니다. 따라서 모든 값의 모든 문자에 대해 루프를 실행하는 프로 시저를 호출하는 테이블의 모든 행에 대해 루프가 있습니다. 이 문제를 해결하는 효율적인 방법은 아닙니다.
Aaron Bertrand

감사. 그러나 나는 Aaron에 동의합니다. 이것은 내가 원하는 것이 아닙니다. 내 테이블의 값이 300k 이상입니다. 그래서 이것은 작동하지 않습니다.
카 시프 쿠 레시
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.