从 sql table 列的数据中删除子字符串

Remove sub-string from data in sql table column

我有一个 table,在某个列中有一堆 url。我们不再需要 table 中的某个 url 而不是手动更新每个数据记录我很好奇是否有办法通过更新查询删除特定类型的 url ?

例如,存在具有以下url的数据记录:

<a href="/publications/gss2007/gss2007_6879.ppt">Presentation (PowerPoint File)</a><br>  <a href="http://xxx.xx.xxx.xx:xxxx/ramgen/Ipam/2007/smil/7-09-am1.smil">Presentation (Webcast)</a>

我想删除 smil url 所以数据只显示:

<a href="/publications/gss2007/gss2007_6879.ppt">Presentation (PowerPoint File)</a><br>

我想从此字符串(来自 )中删除整个 "smil" url,并从其他记录中删除所有其他 smil url(其他记录相似但不同smil 文件名)。有些记录可能有两个以上的 url,但是 "smil" url 总是最后一个。

保留一些评论历史记录,以便未来的读者在实施解决方案之前了解决策点

是否总是遵循text<br>text

的模式

there are a few times where there are two urls and they exclude the <br> and then there are a few times where it is just the smil url within the data.

你还没有明确定义什么是"smil" url。是不是到处都带着微笑?文件后缀为.smil?路径中有 /smil/ 吗?这些的一些组合?

您将要遇到的问题是,要正确解决这个问题,您需要能够深入了解 html 片段。这通常是 .NET 的事情,TSQL 中的字符串匹配可能不足以满足您的需求。您可以尝试多次通过。如果它遵循 text<br>text 模式,您可以 left(myCol, charindex(mycol, '<br>')) 其中 Mycol like '%smil%' 并继续通过它直到找到所有模式。

@billinkc: I see where you are going, I was thinking if it would be possible to remove everything from the start of <a href="xxx since those "smil" links all start with that character string.

而且永远不会出现 <a href="http://xxx">streaming</a><br><a href="/local">foo</a> 的情况?如果是这样,那么是的,使用 charindex/patindex 搜索 <a href="http:(永远记不起是哪个),然后使用 left/substring 将其切出。

@billinkc: yup that will always be the case. the "streaming" url is ALWAYS last. Ok this was easier than I thought, just needed some outside eyes. Thank you.

鉴于我们知道我们不必担心 smil url 之后存在的任何有用的东西 url 将永远是一个外部,我们可以安全地使用 left/substring 方法,例如

DECLARE @Source table
(
    SourceUrl varchar(200)
)
INSERT INTO @Source
(SourceUrl)
VALUES
('<a href="/publications/gss2007/gss2007_6879.ppt">Presentation (PowerPoint File)</a><br>  <a href="http://xxx.xx.xxx.xx:xxxx/ramgen/Ipam/2007/smil/7-09-am1.smil">Presentation (Webcast)</a>');

-- INSPECT THIS, IF APPROPRIATE THEN
SELECT
    S.SourceUrl AS Before
,   CHARINDEX('<a href="http://', S.SourceUrl) AS WhereFound
,   LEFT(S.SourceUrl, CHARINDEX('<a href="http://', S.SourceUrl) -1) AS After
FROM
    @Source AS S
WHERE
    S.SourceUrl LIKE '%smil%';

-- Only run this if you like the results of the above
UPDATE
    S
SET
    SourceUrl = LEFT(S.SourceUrl, CHARINDEX('<a href="http://', S.SourceUrl) -1)
FROM
    @Source AS S
WHERE
    S.SourceUrl LIKE '%smil%';