使用T-SQL解析另一列并更新列

5

我可以为您进行翻译。以下是需要翻译的内容:

我在数据库中有这张表和数据:

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个回答

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 '%-%-%'

你可能需要从标题中去掉空格。

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

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

参考文献:

  • PATINDEX(用于SQL Server):返回某个模式在字符串中第一次出现的起始位置。

  • CHARINDEX(用于SQL Server):返回某个字符或子字符串在另一个字符串中第一次出现的位置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接