T- SQL में एक स्ट्रिंग में अंतिम वर्ण निकालें?


139

मैं एक स्ट्रिंग में अंतिम वर्ण कैसे निकालूं T-SQL?

उदाहरण के लिए:

'TEST STRING'

लौटने के लिये:

'TEST STRIN'

जवाबों:


195

जैसे

DECLARE @String VARCHAR(100)
SET @String = 'TEST STRING'

-- Chop off the end character
SET @String = 
     CASE @String WHEN null THEN null 
     ELSE (
         CASE LEN(@String) WHEN 0 THEN @String 
            ELSE LEFT(@String, LEN(@String) - 1) 
         END 
     ) END


SELECT @String

71
वैकल्पिक रूप से: SELECT LEFT (YourColumnName, LEN (YourColumnName) - 1) अपने से योग्य
काइल B.

3
अशक्त पकड़ने के लिए धन्यवाद - ISNULL (LEFT (@String, LEN (@String) - 1), 'ErrMsg') हल करेगा
Volvox

2
@ वोल्वॉक्स यह अभी भी अपवाद को फेंक देगा यदि स्ट्रिंग खाली है, तो मैं इस परिदृश्य को संभालने के लिए आपके उत्तर को संशोधित कर रहा हूं।
इमरान रिजवी

106

यदि किसी कारण से आपका कॉलम लॉजिक जटिल है (जब ... तब ... और ... अंत), तो उपरोक्त समाधानों के कारण आपको लेन () फ़ंक्शन में उसी तर्क को दोहराना होगा। उसी तर्क की नकल करना एक गड़बड़ हो जाता है। अगर ऐसा है तो यह ध्यान देने योग्य उपाय है। यह उदाहरण अंतिम अवांछित अल्पविराम से छुटकारा दिलाता है। मैंने आखिरकार REVERSE फ़ंक्शन के लिए एक उपयोग पाया।

select reverse(stuff(reverse('a,b,c,d,'), 1, 1, ''))

6
ध्यान दें कि यह कोड NULLयदि स्ट्रिंग को पास करता है जो कि निर्दिष्ट डिलीट रेंज से कम है STUFFISNULLखाली स्ट्रिंग मामले के लिए एक अलग आउटपुट मान प्राप्त करने के लिए इसे लपेटें ।
रोजवेल

11
अच्छा, बाहरी अनुप्रयोग के साथ इसका उपयोग करते हुए, अनुगामी अल्पविराम को खत्म करने के लिए xml पथ ('') के साथ। अजीब
ट्रैकर 1

साथ ही @ Tracker1। LEN () को शामिल करने के विपरीत, खाली स्ट्रिंग (विशेष रूप से ISNULL () में लिपटे हुए) के लिए यह इनायत से काम करता है (- बिना कुछ लपेटे)
gregmac

यह वास्तव में उल्लेखनीय है कि क्रूर SQL कभी-कभी कैसे हो सकता है। बहुत शानदार।
eouw0o83hf

धन्यवाद, इसने मेरी मदद की, मेरे मामले में मेरे पास एक अंतिम स्थान था इसलिए पहला सूचकांक 2 हैselect reverse(stuff(reverse('a,b,c,d,'), 2, 1, ''))
आर्ग्यूज़

52

इसे इस्तेमाल करे:

select substring('test string', 1, (len('test string') - 1))

@ कोई भी विचार क्यों यह एक ही परिणाम के रूप में देने लगता है select substring('test string', 0, len('test string'))?
लुई वावरू

@Louis, सबस्ट्रिंग वाक्य रचना के रूप में इस प्रकार है: SUBSTRING ( expression ,start , length )। अब, दोनों प्रश्न समान हैं क्योंकि अंकन 1 आधारित है, जिसका अर्थ है कि अभिव्यक्ति में पहला वर्ण 1 है। यदि प्रारंभ 1 से कम है, तो लौटा हुआ अभिव्यक्ति पहले वर्ण में शुरू होगा जो अभिव्यक्ति में निर्दिष्ट है। स्रोत
JS5

26

यदि आपका तार खाली है,

DECLARE @String VARCHAR(100)
SET @String = ''
SELECT LEFT(@String, LEN(@String) - 1)

तब यह कोड त्रुटि संदेश का कारण बनेगा 'घटता समारोह में अमान्य लंबाई पैरामीटर।'

आप इसे इस तरह से संभाल सकते हैं:

SELECT LEFT(@String, NULLIF(LEN(@String)-1,-1))

यह हमेशा परिणाम लौटाएगा, और रिक्त स्ट्रिंग के मामले में NULL।



9

स्रोत पाठ / var शून्य या रिक्त होने पर भी यह काम करेगा:

SELECT REVERSE(SUBSTRING(REVERSE(@a), 2, 9999))

2
यह एक अंडररेटेड टिप्पणी है, यह तेज़ है और इसे काम करने के लिए दो बार स्ट्रिंग का चयन नहीं करना है।
रान्डेल

7

यदि आपका कोलम textनहीं है varchar, तो आप इसका उपयोग कर सकते हैं:

SELECT SUBSTRING(@String, 1, NULLIF(DATALENGTH(@String)-1,-1))

5

यदि आप REVERSE-STUFF-REVERSE के तीन के बजाय दो चरणों में यह करना चाहते हैं, तो आप अपनी सूची विभाजक एक या दो रिक्त स्थान हो सकते हैं। फिर RTRIM का उपयोग ट्रेलिंग स्पेस को ट्रिम करने के लिए करें, और डबल स्पेस को ',' से बदलने के लिए REPLACE का उपयोग करें।

select REPLACE(RTRIM('a  b  c  d  '),'  ', ', ')

हालांकि, यह एक अच्छा विचार नहीं है यदि आपके मूल स्ट्रिंग में आंतरिक स्थान हो सकते हैं।

प्रदर्शन के बारे में निश्चित नहीं है। प्रत्येक REVERSE स्ट्रिंग की एक नई प्रतिलिपि बनाता है, लेकिन STUFF REPLACE की तुलना में तीसरा तेज़ है।

यह भी देखना यह




2

आप फ़ंक्शन बना सकते हैं

CREATE FUNCTION [dbo].[TRUNCRIGHT] (@string NVARCHAR(max), @len int = 1)
RETURNS NVARCHAR(max)
AS
BEGIN
    IF LEN(@string)<@len
        RETURN ''
    RETURN LEFT(@string, LEN(@string) - @len)
END


2

अंतिम चरित्र प्राप्त करें

Right(@string, len(@String) - (len(@String) - 1))

मुझे नहीं लगता कि यह वही है जो वह पूछ रहा था, हालांकि - यह एक टिप्पणी में डालने के लिए उपयोगी हो सकता है, हालांकि।
17

3
सिर्फ राइट (@string, 1)।
गोलबेडेड 21

1

मेरा उत्तर स्वीकृत उत्तर के समान है, लेकिन यह नल और खाली स्ट्रिंग के लिए भी जाँच करता है।

DECLARE @String VARCHAR(100)

SET @String = 'asdfsdf1'

-- If string is null return null, else if string is empty return as it is, else chop off the end character
SET @String = Case @String when null then null else (case LEN(@String) when 0 then @String else LEFT(@String, LEN(@String) - 1) end ) end

SELECT @String

1

यह काफी देर से है, लेकिन दिलचस्प रूप से अभी तक कभी उल्लेख नहीं किया गया है।

select stuff(x,len(x),1,'')

अर्थात:

take a string x
go to its last character
remove one character
add nothing

0

मुझे @ बिल-होनिग का उत्तर पसंद है; हालाँकि, मैं एक उपश्रेणी का उपयोग कर रहा था और मैं पकड़ा गया क्योंकि REVERSE फ़ंक्शन को कोष्ठकों के दो सेटों की आवश्यकता थी। मुझे यह पता लगाने में थोड़ा समय लगा कि एक बाहर!

SELECT
   -- Return comma delimited list of all payment reasons for this Visit
   REVERSE(STUFF(REVERSE((
        SELECT DISTINCT
               CAST(CONVERT(varchar, r1.CodeID) + ' - ' + c.Name + ', ' AS VARCHAR(MAX))
          FROM VisitReason r1
          LEFT JOIN ReasonCode c        ON c.ID = r1.ReasonCodeID
         WHERE p.ID = r1.PaymentID
         FOR XML PATH('')
              )), 1, 2, ''))                        ReasonCode
  FROM Payments p

आप क्वेरी के समग्र भाग के लिए एक बाहरी / क्रॉस आवेदन का उपयोग करना चाह सकते हैं। मैं एक मूल आइटम के लिए झंडे का एक सेट पाने के लिए इसका उपयोग कर रहा हूं।
ट्रैकर

0

किसी विशेष कॉलम के अंतिम N अक्षरों को ट्रिम करके रिकॉर्ड को अपडेट करने के लिए:

UPDATE tablename SET columnName = LEFT(columnName , LEN(columnName )-N) where clause

0

कोशिश करो :

  DECLARE @String NVARCHAR(100)
    SET @String = '12354851'
    SELECT LEFT(@String, NULLIF(LEN(@String)-1,-1))

0
declare @string varchar(20)= 'TEST STRING'
Select left(@string, len(@string)-1) as Tada

उत्पादन:

Tada
--------------------
TEST STRIN

0

इसे इस्तेमाल करे,

DECLARE @name NVARCHAR(MAX) SET @name='xxxxTHAMIZHMANI****'SELECT Substring(@name, 5, (len(@name)-8)) as UserNames

और आउटपुट, THAMIZHMANI की तरह होगा


-1
declare @x varchar(20),@y varchar(20)
select @x='sam'
select 
case when @x is null then @y
      when @y is null then @x
      else @x+','+@y
end


go

declare @x varchar(20),@y varchar(20)
select @x='sam'
--,@y='john'
DECLARE @listStr VARCHAR(MAX)   

SELECT @listStr = COALESCE(@x + ', ' ,'') +coalesce(@y+',','')
SELECT left(@listStr,len(@listStr)-1)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.