2013-05-13 5 views
5

मैं अपने डेटाबेस में इस तालिका और डेटा है:अद्यतन स्तंभ T-SQL

tblPhotos

ID | Title | Description 
------------------------------ 
1 | NULL | Some data - Title 123 - Subtitle - Photographer: John Doe 
2 | NULL | Some data - Photographer: Jane Doe 
3 | NULL | Some data - Title 345 - Photographer: John Doe Jr 

Description स्तंभ में डेटा दो प्रारूपों में आता है:

{GARBAGE DATA} - {TITLE DATA} - Photographer: ..., or 
{GARBAGE DATA} - Photographer: ... 

असल में, मेरे पास हजारों पंक्तियां हैं, जहां Title कॉलम खाली है। मुझे किसी भी तरह इसे Description कॉलम से बाहर खींचने की आवश्यकता है।

Title पहले डैश और Description कॉलम के अंतिम डैश के बीच मौजूद है। यहाँ डेटा कैसे दिखाई देते हैं चाहिए:

tblPhotos

ID | Title    | Description 
------------------------------------------------------------------------------------- 
1 | Title 123 - Subtitle | Some data - Title 123 - Subtitle - Photographer: John Doe 
2 | NULL     | Some data - Photographer: Jane Doe 
3 | Title 345   | Some data - Title 345 - Photographer: John Doe Jr 

मैं कैसे एक स्क्रिप्ट है कि एक स्तंभ पार्स जाएगा, और पार्स डेटा है कि के साथ एक और स्तंभ को अद्यतन कर सकते हैं? इस तरह

उत्तर

3

पहले डैश का स्थान आसान है: CHARINDEX('-', Description)। दूसरे डैश का स्थान भी आसान है, लेकिन आप का स्थान अंतिम डैश चाहते हैं। यह थोड़ा कठिन है क्योंकि इसे प्राप्त करने के लिए आपको स्ट्रिंग को उलटना होगा: LEN(Description) - CHARINDEX('-', REVERSE(Description))। में के बीच आप दो स्थानों को घटाकर की लंबाई खोजने की जरूरत है सामग्री प्राप्त करने के लिए:

SUBSTRING(Description, CHARINDEX('-', Description) + 1, LEN(Description) - CHARINDEX('-', REVERSE(Description))) - CHARINDEX('-', Description)

यह सबको एक साथ रखें आपको मिलेगा:

UPDATE tblPhotos 
SET Title = RTRIM(LTRIM(
      SUBSTRING(Description, 
         CHARINDEX('-', Description) + 1, 
         LEN(Description) - CHARINDEX('-', REVERSE(Description)) 
             - CHARINDEX('-', Description)))) 
WHERE Title IS NULL 
3

कोशिश someting:

update tblPhotos 
    set title = substring(description, charindex('-', description)+1, 
          (charindex('-', description, charindex('-', description) + 1) - 
          charindex('-', description) 
         )-1 
         ) 
    where title is null and description like '%-%-%' 

आप शीर्षक से रिक्त स्थान ट्रिम करने के लिए आवश्यकता हो सकती है।

1
UPDATE p 
SET Title = SUBSTRING(p.Description, s.StartPos, e.EndPos - s.StartPos) 
FROM tblPhotos p 
CROSS APPLY (VALUES (PATINDEX('% - % - %:%', p.Description) + 3)) s (StartPos) 
CROSS APPLY (VALUES (CHARINDEX(' - ', p.Description, s.StartPos))) e (EndPos) 
WHERE p.Description LIKE '% - % - %:%' 
; 

PATINDEX की स्थिति वापसी होगी पहले तर्क का पहला गैर मुखौटा चरित्र, इसलिए उपरोक्त क्वेरी में PATINDEX पहले  -  (स्पेस, हाइफ़न, स्पेस) प्रविष्टि की स्थिति लौटाएगा। उस मान में 3 जोड़ना और परिणाम को प्रारंभिक स्थिति के रूप में उपयोग करना, CHARINDEX, इसके बदले में, दूसरी  -  प्रविष्टि की स्थिति लौटाता है, और यह अंतिम स्थिति के रूप में उपनाम है। शीर्षक को निकालने के लिए दो मानों का उपयोग SUBSTRING फ़ंक्शन द्वारा किया जाता है।

एसक्यूएल फिडल डेमो: http://sqlfiddle.com/#!3/d2dd9/3

संदर्भ:

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