通过使用T-SQL解析另一列来更新列

时间:2013-05-13 18:24:53

标签: sql sql-server-2008 tsql

我的数据库中有这个表和数据:

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 个答案:

答案 0 :(得分:3)

尝试这样的事情:

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 :(得分: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

答案 2 :(得分: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函数使用这两个值来提取标题。

SQL小提琴演示:http://sqlfiddle.com/#!3/d2dd9/3

参考文献: