मेरे पास एक स्ट्रिंग है जिसमें कुछ टेक्स्ट है:

उदाहरण:

XPTOP XPTOP 4WS00632 BLACK VERNIS

मैं केवल निकालना चाहता हूँ

4WS00632

और बाकी सब कुछ अनदेखा करें।

मैंने सभी रिक्त स्थान खोजने के लिए charindex का उपयोग करके रिक्त स्थान को अनुक्रमणित करने का प्रयास किया और फिर x पर शुरू करने के लिए एक सबस्ट्रिंग, y पर समाप्त हुआ।

लेकिन, किस्मत नहीं। कभी-कभी यह "4WS0063" या "P 4WS00632" लौटाता है। यह डेटा सुसंगत नहीं है केवल "XPTOP XPTOP" कुछ हद तक सुसंगत है। उदाहरण के लिए "4WS00632" इसमें 8 अंक हैं, लेकिन इसमें 9 या 12 हो सकते हैं।

तो, मुझे वास्तव में तीसरी जगह और चौथी जगह के बीच सब कुछ पकड़ने की जरूरत है।

-1
António Miranda 17 मई 2021, 22:54

5 जवाब

सबसे बढ़िया उत्तर

फिर भी एक और विकल्प JSON के साथ है

उदाहरण या dbFiddle

Select A.SomeCol
      ,NewVal = JSON_VALUE('["'+replace(SomeCol,' ','","')+'"]','$[2]')
 From YourTable  A

परिणाम

SomeCol                                 NewVal
XPTOP XPTOP 4WS00632 BLACK VERNIS       4WS00632
6
John Cappelletti 17 मई 2021, 23:34

यहाँ charindex - और सबस्ट्रिंग का उपयोग करके एक समाधान दिया गया है:

Declare @testTable Table (TestString varchar(100));
 Insert Into @testTable (TestString)
 Values ('XPTOP XPTOP 4WS00632 BLACK VERNIS')
      , ('XYZ XYZ JW2B0037VK3 S17 SENAPE BLACK');

 Select tt.TestString
      , part1 = ltrim(substring(v.TestString, 1, p01.pos - 2))
      , part2 = ltrim(substring(v.TestString, p01.pos, p02.pos - p01.pos - 1))
      , part3 = ltrim(substring(v.TestString, p02.pos, p03.pos - p02.pos - 1))
   From @testTable                                                      As tt
  Cross Apply (Values (concat(tt.TestString, replicate(' ', 3))))       As v(TestString)
  Cross Apply (Values (charindex(' ', v.TestString, 1) + 1))            As p01(pos)
  Cross Apply (Values (charindex(' ', v.TestString, p01.pos) + 1))      As p02(pos)
  Cross Apply (Values (charindex(' ', v.TestString, p02.pos) + 1))      As p03(pos)
0
Jeff 18 मई 2021, 00:25

इस तकनीक को आजमाएं:

DECLARE @text NVARCHAR(MAX) = 'XPTOP XPTOP 4WS00632 BLACK VERNIS';

DECLARE @text_xml XML = '<a>' + REPLACE(@text, ' ', '</a><a>')+ '</a>';

WITH DataSource (element_pos, element_text) AS
(
    SELECT  ROW_NUMBER() OVER (ORDER BY T.c)
           ,T.c.value('(.)[1]', 'nvarchar(128)')
    FROM @text_xml.nodes('a') T(c)
)
SELECT element_text
FROM DataSource
WHERE element_pos = 3;

विचार यह है कि स्ट्रिंग को space से विभाजित किया जाए और strings को उनकी स्थिति के अनुसार क्रमित किया जाए। फिर बस तीसरा प्राप्त करें।

1
gotqn 17 मई 2021, 23:03

कुछ like तुलनाओं के साथ एक विधि string_split() है:

select t.*, s.value
from t cross apply
     (select s.value
      from string_split(t.str, ' ') s
      where t.str like concat('% % % ', s.value, ' %') and
            t.str not like concat('% % % % ', s.value, ' %')
     ) s
        
1
Gordon Linoff 17 मई 2021, 23:34

यह charindex और stuff के संयोजन का उपयोग करने का एक तरीका है।

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

create table #test (col1 varchar(100))
insert into #test values ('XPTOP XPTOP 4WS00632 BLACK VERNIS')
    
with s1(s) as (select Stuff(col1,1,CharIndex(' ',col1),'') from #test),
s2(s) as (select Stuff(s,1, CharIndex(' ',s),'') from s1)

select Left(s, charIndex(' ',s) )
from s2;
1
Stu 17 मई 2021, 23:46