我的数据库中有这个表和数据:
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
如何创建一个解析列的脚本,并使用该解析数据更新另一列?
答案 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
参考文献: