টি-এসকিউএল ব্যবহার করে কোনও স্ট্রিং প্যালিনড্রোম কিনা তা পরীক্ষা করুন


24

আমি টি এসকিউএল এর একটি শিক্ষানবিস। আমি সিদ্ধান্ত নিতে চাই যে ইনপুট স্ট্রিংটি একটি প্যালিনড্রোম কিনা, যদি আউটপুট = 0 না হয় এবং আউটপুট = 1 হয়। আমি এখনও সিনট্যাক্সটি বের করছি। এমনকি আমি একটি ত্রুটি বার্তা পাচ্ছি না। আমি টি-এসকিউএল কীভাবে কাজ করে তার আরও ভাল ধারণা এবং জ্ঞান অর্জন করতে, এটিতে আরও উন্নত হওয়ার জন্য - আমি এখনও এক ছাত্র different

মূল ধারণাটি যেমনটি আমি দেখতে পাচ্ছি, বাম- এবং ডান- বেশিরভাগ অক্ষরকে একে অপরের সাথে তুলনা করা, সাম্যতা যাচাই করা, তারপরে বাম থেকে দ্বিতীয় অক্ষরটিকে শেষের দ্বিতীয় থেকে দ্বিতীয়টির সাথে তুলনা করা ইত্যাদি etc. আমরা একটি লুপ করি: অক্ষরগুলি একে অপরের সমান হলে, আমরা চালিয়ে যাচ্ছি। যদি আমরা শেষের দিকে পৌঁছে, আমরা 1 আউটপুট, যদি না, আমরা 0 আউটপুট করি।

আপনি কি সমালোচনা দয়া করে:

CREATE function Palindrome(
    @String  Char
    , @StringLength  Int
    , @n Int
    , @Palindrome BIN
    , @StringLeftLength  Int
)
RETURNS Binary
AS
BEGIN
SET @ n=1
SET @StringLength= Len(String)

  WHILE @StringLength - @n >1

  IF
  Left(String,@n)=Right(String, @StringLength)

 SET @n =n+1
 SET @StringLength =StringLength -1

 RETURN @Binary =1

 ELSE RETURN @Palindrome =0

END

আমি মনে করি আমি সঠিক পথে আছি তবে আমি এখনও অনেক দূরে। কোন ধারনা?


LTRIM(RTRIM(...))হোয়াইটস্পেস?
WernerCD

উত্তর:


60

আপনি যদি এসকিউএল সার্ভার ব্যবহার করেন তবে আপনি পরীক্ষা করতে রিভার্স () ফাংশনটি ব্যবহার করতে পারেন ?

SELECT CASE WHEN @string = REVERSE(@String) THEN 1 ELSE 0 END AS Palindrome;

মার্টিন স্মিথের মন্তব্য সহ আপনি যদি এসকিউএল সার্ভার 2012+ এ থাকেন তবে আপনি IIF () ফাংশনটি ব্যবহার করতে পারেন :

SELECT IIF(@string = REVERSE(@String),1,0) AS Palindrome;

17

যেহেতু এখানে বেশ কয়েকটি সমাধান রয়েছে আমি আপনার প্রশ্নের "সমালোচনা" অংশ নিয়ে যাচ্ছি। কয়েকটি নোট: আমি কিছু টাইপস স্থির করেছি এবং আমি কোথায় করেছি তা উল্লেখ করেছি। আমি যদি তাদের সম্পর্কে টাইপো হওয়া সম্পর্কে ভুল হয়ে থাকি তবে তা মন্তব্যে উল্লেখ করুন এবং আমি কী ঘটছে তা ব্যাখ্যা করব। আমি বেশ কয়েকটি বিষয় উল্লেখ করতে যাচ্ছি যা আপনি ইতিমধ্যে জেনে থাকতে পারেন, তাই দয়া করে আমি যদি তা না করি তবে অপরাধ করবেন না। কিছু মন্তব্য পিক মনে হতে পারে তবে আমি জানি না আপনি কোথায় যাত্রা করছেন তাই ধরে নিতে হবে আপনি সবে শুরু করছেন।

CREATE function Palindrome (
    @String  Char
    , @StringLength  Int
    , @n Int
    , @Palindrome BIN
    , @StringLeftLength  Int

সর্বদা একটি সংজ্ঞা charবা varcharসংজ্ঞা সহ দৈর্ঘ্য অন্তর্ভুক্ত করে । অ্যারন বারট্র্যান্ড এখানে গভীরতার সাথে আলোচনা করে । তিনি কথা বলছেন varcharকিন্তু একই জন্য যায় charvarchar(255)আপনি যদি কেবল তুলনামূলকভাবে ছোট স্ট্রিং চান বা একটি varchar(8000)বৃহত্তর বা এমনকি একটির জন্য চান তবে আমি এটির জন্য একটি ব্যবহার করব varchar(max)Varcharপরিবর্তনশীল দৈর্ঘ্যের স্ট্রিং charকেবল স্থিরদের জন্য for যেহেতু আপনি নিশ্চিত নন যে স্ট্রিংয়ের দৈর্ঘ্যটি ব্যবহারের মধ্যে দিয়ে যাচ্ছে varchar। এছাড়াও এটি binaryনা bin

পরবর্তী আপনাকে পরামিতি হিসাবে vari সমস্ত পরিবর্তনশীল রাখার দরকার নেই। এগুলি আপনার কোডের মধ্যে ঘোষণা করুন। প্যারামিটার তালিকায় কেবল কোনও কিছু রাখুন যদি আপনি এটি পাস বা বাইরে পাস করার পরিকল্পনা করেন। (আপনি দেখতে পাবেন কিভাবে এটি শেষের দিকে দেখায়)) এছাড়াও আপনার কাছে @ স্ট্রিং লেফট লেংথ রয়েছে তবে এটি কখনই ব্যবহার করবেন না। সুতরাং আমি এটি ঘোষণা করতে যাচ্ছি না।

পরবর্তী কাজটি আমি যা করতে যাচ্ছি তা হ'ল কিছু বিষয় পরিষ্কার করার জন্য কিছুটা পুনরায় ফর্ম্যাট করা।

BEGIN
    SET @n=1
    SET @StringLength = Len(@String) -- Missed an @

    WHILE @StringLength - @n >1 
        IF Left(@String,@n)=Right(@String, @StringLength) -- More missing @s
            SET @n = @n + 1 -- Another missing @

    SET @StringLength = @StringLength - 1  -- Watch those @s :)

    RETURN @Palindrome = 1 -- Assuming another typo here 

    ELSE 
        RETURN @Palindrome =0

END

আমি যেভাবে ইনডেন্টিং করেছি সেদিকে নজর দিলে আপনি দেখতে পাবেন যে আমার কাছে এটি রয়েছে:

    WHILE @StringLength - @n >1 
        IF Left(@String,@n)=Right(@String, @StringLength)
            SET @n = @n + 1

এটি কারণ কমান্ড পছন্দ WHILEIF তাদের পরে কোডের প্রথম লাইনটিকে এবং প্রভাবিত করে। আপনি BEGIN .. ENDএকাধিক কমান্ড চাইলে আপনাকে একটি ব্লক ব্যবহার করতে হবে । সুতরাং আমরা ঠিক করেছি যে স্থির:

    WHILE @StringLength - @n > 1 
        IF Left(@String,@n)=Right(@String, @StringLength)
            BEGIN 
                SET @n = @n + 1
                SET @StringLength = @StringLength - 1
                RETURN @Palindrome = 1 
            END
        ELSE 
            RETURN @Palindrome = 0

আপনি লক্ষ্য করবেন যে আমি কেবল একটি যুক্ত করেছি BEGIN .. END ব্লকIF । কারণ কারণ যদিও IFবিবৃতিটি একাধিক লাইন দীর্ঘ (এবং এমনকি একাধিক কমান্ড রয়েছে) এটি এখনও একটি একক বিবৃতি (সমস্ত কিছুতে IFএবংELSE অংশগুলির করে)।

এর পরে আপনি আপনার উভয়ের পরে একটি ত্রুটি পাবেন RETURNs । আপনি একটি চলক বা একটি আক্ষরিক ফিরে আসতে পারেন। আপনি ভেরিয়েবল সেট করতে এবং একই সাথে এটি ফিরিয়ে দিতে পারবেন না।

                SET @Palindrome = 1 
            END
        ELSE 
            SET @Palindrome = 0

    RETURN @Palindrome

এখন আমরা যুক্তিযুক্ত। প্রথমে আমাকে উল্লেখ করতে দিন যেLEFTRIGHT আপনি এবং ফাংশনগুলি ব্যবহার করছেন তা দুর্দান্ত, তবে তারা আপনাকে অনুরোধ করা দিক থেকে আপনি যে পরিমাণ অক্ষরের পাশ দিয়ে চলেছেন তা দিতে চলেছে। সুতরাং যাক আপনি "পরীক্ষা" শব্দটিতে পাস করেছেন। প্রথম পাসে আপনি এটি পেতে চলেছেন (ভেরিয়েবল অপসারণ):

LEFT('test',1) = RIGHT('test',4)
    t          =      test

LEFT('test',2) = RIGHT('test',3)
    te         =      est

স্পষ্টতই এটি আপনি প্রত্যাশা করেননি। আপনি সত্যিই ব্যবহার করতে চানsubstringপরিবর্তে । সাবস্ট্রিং আপনাকে কেবল প্রারম্ভিক বিন্দুতে নয় দৈর্ঘ্যেও যেতে দেয়। সুতরাং আপনি পাবেন:

SUBSTRING('test',1,1) = SUBSTRING('test',4,1)
         t            =         t

SUBSTRING('test',2,1) = SUBSTRING('test',3,1)
         e            =         s

এরপরে আপনি আপনার লুপে কেবলমাত্র আইএফ স্টেটমেন্টের একটি শর্তে ব্যবহার করেন এমন ভেরিয়েবলগুলি বাড়িয়ে দিচ্ছেন। ভেরিয়েবল ইনক্রিমেন্টিং পুরোপুরি সেই কাঠামোর বাইরে টানুন। এটি একটি অতিরিক্ত প্রয়োজন হতে যাচ্ছেBEGIN .. END ব্লক প্রয়োজন, কিন্তু আমি অন্য একটি অপসারণ করতে হবে।

        WHILE @StringLength - @n > 1 
            BEGIN
                IF SUBSTRING(@String,@n,1) = SUBSTRING(@String, @StringLength,1)
                    SET @Palindrome = 1 
                ELSE 
                    SET @Palindrome = 0

                SET @n = @n + 1
                SET @StringLength = @StringLength - 1
            END

আপনার আপনার পরিবর্তন করা প্রয়োজন WHILEশেষ পরীক্ষার জন্য আপনাকে অবস্থার ।

        WHILE @StringLength > @n 

এবং সর্বশেষে তবে সর্বনিম্ন নয়, এখন এটি যেভাবে দাঁড়িয়েছে আমরা যদি শেষের অক্ষরটি পরীক্ষা করি না তবে যদি সেখানে একটি বিচিত্র সংখ্যক চরিত্র থাকে। উদাহরণস্বরূপ 'আনা' দিয়েn পরীক্ষা করা হয়নি। এটি ঠিক আছে তবে এটি আমার কী দরকার যে আমাদের একটি একক অক্ষরের শব্দের জন্য অ্যাকাউন্ট করতে হবে (যদি আপনি এটি ইতিবাচক হিসাবে গণনা করতে চান)। সুতরাং আমরা সামনে ভ্যালু সেট আপ করতে পারেন।

এবং এখন আমাদের শেষ পর্যন্ত:

CREATE FUNCTION Palindrome (@String  varchar(255)) 
RETURNS Binary
AS

    BEGIN
        DECLARE @StringLength  Int
            , @n Int
            , @Palindrome binary

        SET @n = 1
        SET @StringLength = Len(@String)
        SET @Palindrome = 1

        WHILE @StringLength > @n 
            BEGIN
                IF SUBSTRING(@String,@n,1) = SUBSTRING(@String, @StringLength,1)
                    SET @Palindrome = 1 
                ELSE 
                    SET @Palindrome = 0

                SET @n = @n + 1
                SET @StringLength = @StringLength - 1
            END
        RETURN @Palindrome
    END

একটি শেষ মন্তব্য। আমি সাধারণভাবে ফর্ম্যাট করার একটি বড় অনুরাগী। আপনার কোডটি কীভাবে কাজ করে তা দেখতে এটি আপনাকে সত্যই সহায়তা করতে পারে এবং সম্ভাব্য ভুলগুলি চিহ্নিত করতে সহায়তা করে।

সম্পাদন করা

স্পিনএক্সএক্সএক্সএক্স যেমন উল্লেখ করেছে যে আমাদের যুক্তিতে এখনও ত্রুটি রয়েছে। একবার আমরা আঘাত করে 0 তে ELSEসেট @Palindromeকরে চলার কোনও মানে হয় না। আসলে সেই মুহুর্তে আমরা ঠিক করতে পারি RETURN

                IF SUBSTRING(@String,@n,1) = SUBSTRING(@String, @StringLength,1)
                    SET @Palindrome = 1 
                ELSE 
                    RETURN 0

প্রদত্ত যে আমরা এখন কেবল @Palindrome"এটি এখনও সম্ভব এটি একটি প্যালিনড্রোম" এর জন্য ব্যবহার করছি এটি হওয়ার কোনও সত্যিকার অর্থেই এর অর্থ নেই। আমরা ভেরিয়েবল থেকে মুক্তি পেতে পারি এবং ব্যর্থতার (শ ) এবং (একটি ইতিবাচক প্রতিক্রিয়া) শর্ট সার্কিটের সাথে আমাদের যুক্তিটি তখনই লুপটির মাধ্যমে তৈরি করতে পারি। আপনি লক্ষ্য করবেন এটি আসলে আমাদের যুক্তি কিছুটা সহজ করে দেয়।RETURN 0RETURN 1

CREATE FUNCTION Palindrome (@String  varchar(255)) 
RETURNS Binary
AS

    BEGIN
        DECLARE @StringLength  Int
            , @n Int

        SET @n = 1
        SET @StringLength = Len(@String)

        WHILE @StringLength > @n 
            BEGIN
                IF SUBSTRING(@String,@n,1) <> SUBSTRING(@String, @StringLength,1)
                    RETURN 0

                SET @n = @n + 1
                SET @StringLength = @StringLength - 1
            END
        RETURN 1
    END

15

আপনি একটি নম্বর টেবিল পদ্ধতিরও ব্যবহার করতে পারেন।

যদি আপনার কাছে ইতিমধ্যে সহায়তার নম্বর সারণী না থাকে তবে আপনি নীচের মতো একটি তৈরি করতে পারেন। এটি একটি মিলিয়ন সারি দ্বারা জনবহুল এবং তাই 2 মিলিয়ন অক্ষর পর্যন্ত স্ট্রিং দৈর্ঘ্যের জন্য ভাল।

CREATE TABLE dbo.Numbers (number int PRIMARY KEY);

INSERT INTO dbo.Numbers
            (number)
SELECT TOP 1000000 ROW_NUMBER() OVER (ORDER BY @@SPID)
FROM   master..spt_values v1,
       master..spt_values v2 

নীচে বাম দিকের প্রতিটি চরিত্রের সাথে ডানদিকে সংশ্লিষ্ট অংশীদারটির সাথে তুলনা করে এবং যদি কোনও তাত্পর্য পাওয়া যায় তবে শর্ট সার্কিট এবং ফিরে আসতে পারে the যদি স্ট্রিংটি একটি বিজোড় দৈর্ঘ্য হয় তবে মধ্যবর্তী অক্ষরটি পরীক্ষা করা হয় না কারণ এটি ফলাফলকে পরিবর্তন করবে না result ।

DECLARE @Candidate VARCHAR(MAX) = 'aibohphobia'; /*the irrational fear of palindromes.*/

SET @Candidate = LTRIM(RTRIM(@Candidate)); /*Ignoring any leading or trailing spaces. 
                      Could use `DATALENGTH` instead of `LEN` if these are significant*/

SELECT CASE
         WHEN EXISTS (SELECT *
                      FROM   dbo.Numbers
                      WHERE  number <= LEN(@Candidate) / 2
                             AND SUBSTRING(@Candidate, number, 1) 
                              <> SUBSTRING(@Candidate, 1 + LEN(@Candidate) - number, 1))
           THEN 0
         ELSE 1
       END AS IsPalindrome 

এটি কীভাবে কাজ করে তা আপনি যদি নিশ্চিত না হন তবে নীচের থেকে দেখতে পাবেন

DECLARE @Candidate VARCHAR(MAX) = 'this is not a palindrome';

SELECT SUBSTRING(@Candidate, number, 1)                       AS [Left],
       SUBSTRING(@Candidate, 1 + LEN(@Candidate) - number, 1) AS [Right]
FROM   dbo.Numbers
WHERE  number <= LEN(@Candidate) / 2; 

এখানে চিত্র বর্ণনা লিখুন

এটি মূলত প্রশ্নটিতে বর্ণিত একই অ্যালগরিদম, তবে পুনরাবৃত্ত পদ্ধতিগত কোডের পরিবর্তে সেট ভিত্তিক উপায়ে সম্পন্ন হয়েছে।


12

REVERSE()পদ্ধতি "উন্নত", অর্থাত স্ট্রিং কেবলমাত্র অর্ধেক reversing:

SELECT CASE WHEN RIGHT(@string, LEN(@string)/2) 
                 = REVERSE(LEFT(@string, LEN(@string)/2)) 
            THEN 1 ELSE 0 END AS Palindrome;

আমি স্ট্রিংয়ের একটি বিজোড় সংখ্যক অক্ষর থাকলে অদ্ভুত কিছু হওয়ার আশা করি না; মাঝের চরিত্রটি পরীক্ষা করতে হবে না।


@Hvd দ্বারা একটি মন্তব্য উত্থাপিত হয়েছিল যে এটি কোনও জোটে সার্গেট জুড়িগুলি সঠিকভাবে পরিচালনা করতে পারে না।

@ শ্রুতজকি মন্তব্য করেছিলেন যে এটি পরিপূরক চরিত্রগুলি / সারোগেট পেয়ারগুলি পদ্ধতির মতো একইভাবে পরিচালনা করে REVERSE(), যাতে বর্তমান ডাটাবেসের ডিফল্ট কোলিশন শেষ হয়ে গেলে তারা কেবল সঠিকভাবে কাজ করে _SC


8

ব্যবহার না করে REVERSEযা তাত্ক্ষণিক মনে আসে, তবে এখনও 1 ফাংশন ব্যবহার করে ; আমি নিম্নলিখিত মত কিছু নির্মাণ করা হবে।

এই অংশটি ইতিমধ্যে বিদ্যমান ফাংশনটি কেবল সরিয়ে ফেলেছে:

IF OBJECT_ID('dbo.IsPalindrome') IS NOT NULL
DROP FUNCTION dbo.IsPalindrome;
GO

এটি নিজেই ফাংশন:

CREATE FUNCTION dbo.IsPalindrome
(
    @Word NVARCHAR(500)
) 
RETURNS BIT
AS
BEGIN
    DECLARE @IsPalindrome BIT;
    DECLARE @LeftChunk NVARCHAR(250);
    DECLARE @RightChunk NVARCHAR(250);
    DECLARE @StrLen INT;
    DECLARE @Pos INT;

    SET @RightChunk = '';
    SET @IsPalindrome = 0;
    SET @StrLen = LEN(@Word) / 2;
    IF @StrLen % 2 = 1 SET @StrLen = @StrLen - 1;
    SET @Pos = LEN(@Word);
    SET @LeftChunk = LEFT(@Word, @StrLen);

    WHILE @Pos > (LEN(@Word) - @StrLen)
    BEGIN
        SET @RightChunk = @RightChunk + SUBSTRING(@Word, @Pos, 1)
        SET @Pos = @Pos - 1;
    END

    IF @LeftChunk = @RightChunk SET @IsPalindrome = 1;
    RETURN (@IsPalindrome);
END
GO

এখানে, আমরা ফাংশনটি পরীক্ষা করি:

IF dbo.IsPalindrome('This is a word') = 1 
    PRINT 'YES'
ELSE
    PRINT 'NO';

IF dbo.IsPalindrome('tattarrattat') = 1 
    PRINT 'YES'
ELSE
    PRINT 'NO';

এটি শব্দের প্রথম অর্ধেকের সাথে শব্দটির শেষের অর্ধেকের বিপরীতে ( REVERSEফাংশনটি ব্যবহার না করে) তুলনা করে । এই কোডটি বিজোড় এবং দৈর্ঘ্যের উভয় শব্দকেই সঠিকভাবে পরিচালনা করে। পুরো শব্দের মধ্য দিয়ে লুপিংয়ের পরিবর্তে আমরা কেবল শব্দের LEFTপ্রথম অর্ধের অংশটি পাই, তারপরে ডান অর্ধের বিপরীত অংশটি পেতে শব্দের শেষ অর্ধেকের মধ্য দিয়ে লুপ করব। শব্দটি যদি একটি বিজোড় দৈর্ঘ্যের হয় তবে আমরা মাঝের অক্ষরটি এড়িয়ে যাব কারণ সংজ্ঞা অনুসারে এটি "অর্ধেক" উভয়ের ক্ষেত্রেই সমান হবে।


1 - ফাংশন খুব ধীর হতে পারে!


6

REVERSE ব্যবহার না করে ... একটি পুনরাবৃত্ত সমাধানটি ব্যবহার করা সবসময় মজাদার;) (আমি এসকিউএল সার্ভারে কাজ করেছি 2012, পূর্ববর্তী সংস্করণগুলির পুনরাবৃত্তির ক্ষেত্রে সীমাবদ্ধতা থাকতে পারে)

create function dbo.IsPalindrome (@s varchar(max)) returns bit
as
begin
    return case when left(@s,1) = right(@s,1) then case when len(@s) < 3 then 1 else dbo.IsPalindrome(substring(@s,2,len(@s)-2)) end else 0 end;
end;
GO

select dbo.IsPalindrome('a')
1
select dbo.IsPalindrome('ab')
0
select dbo.IsPalindrome('bab')
1
select dbo.IsPalindrome('gohangasalamiimalasagnahog')
1

6

এটি মার্টিন স্মিথের সেট-ভিত্তিক সমাধানের একটি অন্তর্নিহিত টিভিএফ-বান্ধব সংস্করণ , অতিরিক্তভাবে অতিরিক্ত অতিরিক্ত কিছু বৃদ্ধি সহ সজ্জিত:

WITH Nums AS
(
  SELECT
    N = number
  FROM
    dbo.Numbers WITH(FORCESEEK) /*Requires a suitably indexed numbers table*/
)
SELECT
  IsPalindrome =
    CASE
      WHEN EXISTS
      (
        SELECT *
        FROM Nums
        WHERE N <= L / 2
          AND SUBSTRING(S, N, 1) <> SUBSTRING(S, 1 + L - N, 1)
      )
      THEN 0
      ELSE 1
    END
FROM
  (SELECT LTRIM(RTRIM(@Candidate)), LEN(@Candidate)) AS v (S, L)
;

5

কেবল মজাদার জন্য, এখানে একটি এসকিউএল সার্ভার 2016 স্কেলার ইন-মেমোরি ওয়ালটিপি বৈশিষ্ট্য সহ ব্যবহারকারী-সংজ্ঞায়িত ফাংশন:

ALTER FUNCTION dbo.IsPalindrome2 ( @inputString NVARCHAR(500) )
RETURNS BIT
WITH NATIVE_COMPILATION, SCHEMABINDING
AS
BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'English')

    DECLARE @i INT = 1, @j INT = LEN(@inputString)

    WHILE @i < @j
    BEGIN
        IF SUBSTRING( @inputString, @i, 1 ) != SUBSTRING( @inputString, @j, 1 )
        BEGIN
            RETURN(0)
        END
        ELSE
            SELECT @i+=1, @j-=1

    END

    RETURN(1)

END
GO

4

আপনি যে প্রধান সমস্যাটি চালাতে যাচ্ছেন তা হ'ল 1 এর চেয়ে বেশি মান সহকারে LEFTবা RIGHTএকাধিক অক্ষর ফেরত দেবে, সেই অবস্থানে থাকা চরিত্রটি নয়। আপনি যদি এই পরীক্ষার পদ্ধতিটি ধরে রাখতে চান তবে এটি পরিবর্তন করার একটি সহজ উপায়

RIGHT(LEFT(String,@n),1)=LEFT(RIGHT(String, @StringLength),1)

এটি সর্বদা বাম স্ট্রিংয়ের ডানদিকের চরিত্র এবং ডান স্ট্রিংয়ের বামতম অক্ষরটি দখল করবে।

এটি চেক করার জন্য সম্ভবত কোনও চূড়ান্ত উপায়, যদিও এটি ব্যবহার করা হবে SUBSTRING:

SUBSTRING(String, @n, 1) = SUBSTRING(String, ((LEN(String) - @n) + 1), 1)

নোটটি SUBSTRING1-ইনডেক্সড, সুতরাং + 1ইন ((LEN(String) - @n) + 1)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.