एक बार में 1 वर्ण छीनने वाले मूल्यों के माध्यम से लूपिंग


10

मैं मूल्यों के माध्यम से लूप करना चाहता हूं और मूल्यों से एक बार में 1 वर्ण को छीनता हूं और परिणाम प्रदर्शित करता हूं।

इसलिए यदि मेरे पास मानों के साथ एक तालिका है:

ID
___
34679
13390
89906

मैं चाहता हूं कि परिणाम इस तरह दिखे

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

जवाबों:


19

कृपया इस तरह की चीजों के लिए लूप्स का उपयोग न करें (मैं उन परिदृश्यों के लिए पुनरावर्ती CTEs आरक्षित करूंगा जहां आपका चीजों पर बहुत कम नियंत्रण है, जैसे पदानुक्रम)। 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
क्या आप कुछ स्पष्टीकरण प्रदान कर सकते हैं कि आपका कोड कैसे काम करता है? जो भविष्य के आगंतुकों की मदद करेगा।
परिजन शाह

-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
तो जब आप तालिका में कई पंक्तियाँ हैं, तो आप इसे कैसे प्रस्तावित करते हैं? प्रक्रिया को बुलाओ - एक लूप में - हर पंक्ति के लिए? अब आपको उन सभी मानों को खींचने के लिए एक क्वेरी की आवश्यकता है, और फिर प्रत्येक के लिए संग्रहीत प्रक्रिया को कॉल करने के लिए कोड बनाता है। तो आपके पास तालिका में हर पंक्ति के लिए एक लूप है जो एक ऐसी प्रक्रिया को कहता है जो स्वयं हर मूल्य में प्रत्येक वर्ण के लिए लूप चलाता है। यह निश्चित रूप से इस समस्या को हल करने का एक प्रभावी तरीका नहीं है।
हारून बर्ट्रेंड

धन्यवाद। लेकिन, मैं हारून से सहमत हूं। यह वह नहीं है जो मैं चाहता था। मेरी तालिका में 300k से अधिक मान हैं। तो यह काम नहीं करेगा।
काशिफ कुरैशी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.