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

Ste*_*ven 5 sql t-sql sql-server-2008

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

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
Run Code Online (Sandbox Code Playgroud)

Description列中的数据有两种格式:

{GARBAGE DATA} - {TITLE DATA} - Photographer: ..., or
{GARBAGE DATA} - Photographer: ...
Run Code Online (Sandbox Code Playgroud)

基本上,我有数千行,其中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
Run Code Online (Sandbox Code Playgroud)

如何创建一个解析列的脚本,并使用该解析数据更新另一列?

Gab*_*abe 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
Run Code Online (Sandbox Code Playgroud)