2013-05-13 18 views
5

benim veritabanında bu tablo ve veri var:Güncelleme kolon T-SQL

tblPhotos Description sütunda

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 

veriler iki biçimi vardır:

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

Temel olarak, Title sütununun boş olduğu binlerce satır var. Bir şekilde Description sütunundan çekmem gerekiyor.

Title, Description sütununun ilk çizgi ve son çizgisi arasında bulunur. İşte veriler gibi görünmelidir ne:

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 

nasıl bir sütun ayrıştırmak ve bununla başka bir sütun verilerini çözümlenen güncelleyecek bir komut dosyası yapabilirsiniz ? Böyle

cevap

3

İlk çizginin konumu kolaydır: CHARINDEX('-', Description). İkinci çizginin yeri de kolaydır, ancak işaretinin son satırının sonunu istersiniz. Bu biraz daha zor çünkü onu almak için dizgiyi ters çevirmeniz gerekiyor: LEN(Description) - CHARINDEX('-', REVERSE(Description)). İki pozisyon çıkarılarak uzunluğunu bulmalıyız arasına malzeme almak için:

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

Hepsini bir araya getirirsek elde edersiniz:

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

deneyin someting: Başlığa boşlukları kırpmak gerekebilir

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 pozisyonunu dönecekti İlk argümanın ilk maskesiz karakteri, yani yukarıdaki sorgudaki PATINDEX, ilk  -  (boşluk, kısa çizgi, boşluk) girişinin konumunu döndürür. Bu değere 3 ekleme ve sonucu başlangıç ​​pozisyonu olarak kullanarak, CHARINDEX, sırayla, ikinci  -  girişinin konumunu döndürür ve bu, son konum olarak takma addır. Daha sonra iki değer, başlığı çıkarmak için SUBSTRING işlevi tarafından kullanılır.

SQL Fiddle demo: http://sqlfiddle.com/#!3/d2dd9/3

Referanslar: