วนลูปผ่านค่าที่ลอก 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

ขอขอบคุณสำหรับความช่วยเหลือของคุณ นี่คือสิ่งที่ฉันพยายามจะทำให้สำเร็จ
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
คุณสามารถให้คำอธิบายเกี่ยวกับวิธีการทำงานของรหัสของคุณได้หรือไม่? ที่จะช่วยให้ผู้เข้าชมในอนาคต
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

ขอบคุณ แต่ฉันเห็นด้วยกับแอรอน นี่ไม่ใช่สิ่งที่ฉันต้องการ ตารางของฉันมีค่ามากกว่า 300k ดังนั้นสิ่งนี้จะไม่ทำงาน
Kashif Qureshi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.