2016-09-28 7 views
6

से पिछले दो शब्द निकालें मैं अपनी स्ट्रिंग से अंतिम शब्द निकालने का प्रयास कर रहा हूं।मेरी स्ट्रिंग

उदाहरण

इनपुट स्ट्रिंग:GGG_FFFF_AAAA_BBBBBB_CCC_DDDDD

परिणाम

╔═══════════╦════════════╗ 
║ FIRST_COL ║ SECOND_COL ║ 
╠═══════════╬════════════╣ 
║ CCC  ║ DDDDD  ║ 
╚═══════════╩════════════╝ 

मैं नीचे दिए गए कोड काम कर रहा है।

DECLARE @STR VARCHAR(50) = 'GGG_FFFF_AAAA_BBBBBB_CCC_DDDDD' 

SELECT 
Reverse(LEFT(Stuff(Reverse(@STR), 1, Charindex('_', Reverse(@STR)) + 1 - 1, ''), Charindex('_', Stuff(Reverse(@STR), 1, Charindex('_', Reverse(@STR)) + 1 - 1, '')) - 1)) as FIRST_COL, 
Reverse(LEFT(Reverse(@STR), Charindex('_', Reverse(@STR)) - 1)) as SECOND_COL 

वहाँ प्राप्त करने के लिए किसी भी सरल इस

+0

संभावित डुप्लिकेट [कॉलम से अल्पविराम से अलग मूल्य को कैसे विभाजित करें] (http://stackoverflow.com/questions/10581772/how-to-split-a-comma-separated-value-to-columns) –

उत्तर

5

आप एक्सएमएल का उपयोग कर सकते हैं:

DECLARE @input nvarchar(max) = 'GGG_FFFF_AAAA_BBBBBB_CCC_DDDDD', 
     @x xml 

SELECT @x = CAST('<a>'+REPLACE(REVERSE(@input),'_','</a><a>')+'</a>' as xml) 


SELECT REVERSE(@x.value('/a[2]','nvarchar(max)')) as FIRST_COL, 
     REVERSE(@x.value('/a[1]','nvarchar(max)')) as SECOND_COL 

आउटपुट:

FIRST_COL SECOND_COL 
CCC   DDDDD 
3

आप उपयोग कर सकते हैं PARSENAME (2012 से शुरू होने वाले)

DECLARE @Val NVARCHAR(100)= 'AAAA_BBB_CCC_DDDDD' 
SELECT PARSENAME(REPLACE(@Val, '_', '.'), 1) -- DDDDD 
SELECT PARSENAME(REPLACE(@Val, '_', '.'), 2) -- CCC 

नोट है: यह एक से अधिक 3 _

+0

लंबाई तय नहीं है कि इसमें 4 से अधिक '_' –

+0

हो सकते हैं आपका उत्तर दूसरों से बेहतर है –

+0

@ सांडिपपेटेल - समस्या यह है कि जब आप 3 से अधिक' _' –

2
Declare @Var1 VARCHAR(MAX)='AAAA_BBB_CCC_DDDDDDD' 

----SELECT CHARINDEX('_',REVERSE(@Var1)) 
SELECT RIGHT(@Var1,CHARINDEX('_',REVERSE(@Var1))-1) 


-----SELECT REPLACE(@Var1,RIGHT(@Var1,CHARINDEX('_',REVERSE(@Var1))),'') 

--SELECT CHARINDEX('_',REVERSE(
-- REPLACE(@Var1,RIGHT(@Var1,CHARINDEX('_',REVERSE(@Var1))),'') 
--)) 

SELECT RIGHT(
REPLACE(@Var1,RIGHT(@Var1,CHARINDEX('_',REVERSE(@Var1))),''), 
CHARINDEX('_',REVERSE(
    REPLACE(@Var1,RIGHT(@Var1,CHARINDEX('_',REVERSE(@Var1))),'') 
))-1) 
के लिए सही नहीं है
1

आप के रूप

DECLARE @Val NVARCHAR(100)= 'AAAA_BBB_CCC_DDDDD' 
;with cte as (
    select id, val, MAX(id) over (partition by 1) maximum 
    from dbo.SQLSplitString(@Val,'_',1,0) t 
) 
select val from cte where id >= maximum - 1 

इस प्रकार एक उपयोगकर्ता परिभाषित कस्टम फ़ंक्शन का उपयोग आप पा सकते हैं कर सकते हैं SQL split function codes यहाँ

1

इस प्रयास करें: स्ट्रिंग भंडारण करते हैं, दुकान यह रिवर्स के रूप में है जो संयुक्त राष्ट्र-निरंतर कॉल को स्ट्रिंग रिवर्स

बनाने के लिए कम करता है 210
DECLARE @STR VARCHAR(50) =REVERSE('GGG_FFFF_AAAA_BBBBBB_CCC_DDDDD') 

SELECT REVERSE(SUBSTRING(@STR,0, CHARINDEX('_',@STR))), 
     REVERSE(SUBSTRING(@STR,CHARINDEX('_',@STR,CHARINDEX('_',@STR))+1,3)) 
+1

आपको परिणाम को उलट करने की आवश्यकता है –

संबंधित मुद्दे