5

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

tbl照片

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。数据应如下所示:

tbl照片

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

如何制作一个解析列的脚本,并使用解析后的数据更新另一列?

4

3 回答 3

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
于 2013-05-13T18:50:28.010 回答
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 '%-%-%'

您可能需要修剪标题中的空格。

于 2013-05-13T18:47:04.943 回答
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 Fiddle 演示:http ://sqlfiddle.com/#!3/d2dd9/3

参考:

于 2013-05-13T21:32:32.590 回答