SQL Server从给定的开始和结束字符中删除子字符串

时间:2020-06-27 17:25:22

标签: sql sql-server database function

我正在做一个与某些产品的化学式有关的项目。

数据库中有许多包含<sub><span>标签的产品公式条目,如下所示:

C<sub>7</sub>H<sub><span style="font-size: 10px;">8</sub>O<sub>3</sub>S.H<sub>2</sub>O

我正在寻找摆脱span标签及其内容的方法(我不想删除sub标签)。例如,在上面的示例中,我想摆脱这一部分:

<span style="font-size: 10px;">

基本上,该函数将需要删除给定的开始和结束子字符串之间的所有内容。 是否有SQL Server函数可以删除“ ”和“ > ”之间的所有内容?

谢谢!

2 个答案:

答案 0 :(得分:3)

如果我们假设可以有多个span标签,并且需要删除</span>,那么我们就必须做一些难看的SQL。就像我在评论中所说的那样,理想情况下不要使用T-SQL来做到这一点,而应使用支持Regex的语言:

WITH YourTable AS(
    SELECT *
    FROM (VALUES('C<sub>7</sub>H<sub><span style="font-size: 10px;">8</sub>O<sub>3</sub>S.H<sub>2</sub>O'),
                ('C<sub>7</sub>H<sub><span style="font-size: 12px;">8</sub>O<sub>3</sub></span>S.H<sub>2</sub>O'),
                ('C<sub>7</sub>H<sub><span style="font-size: 8px; font-style:arial">8</sub>O<sub>3</sub></span>S.H<sub>2</sub>O'),
                ('C<sub>7</sub>H<sub><span style="font-size: 12px;">8</sub>O<sub>3</sub></span><span style="font-size: 8px;">S.H</span><sub>2</sub>O'),
                ('C<sub>7</sub>H<sub>8</sub>O<sub>3</sub>S.H<sub>2</sub>O'))V(YourString)),
rCTE AS(
    SELECT YT.YourString,
           V.CI,
           CASE V.CI WHEN 0 THEN YT.YourString ELSE STUFF(YT.YourString,V.CI,CHARINDEX('>',YT.YourString,V.CI) - V.CI +1 ,'') END AS NewString,
           1 AS Iteration
    FROM YourTable YT
         CROSS APPLY (VALUES(CHARINDEX('<span',YT.YourString)))V(CI)
    UNION ALL
    SELECT r.YourString,
           V.CI,
           CASE V.CI WHEN 0 THEN r.NewString ELSE STUFF(r.NewString,V.CI,CHARINDEX('>',r.NewString,V.CI) - V.CI +1 ,'') END AS NewString,
           r.Iteration + 1
    FROM rCTE r
         CROSS APPLY (VALUES(CHARINDEX('<span',r.NewString)))V(CI)
    WHERE V.CI > 0)
SELECT TOP 1 WITH TIES
       REPLACE(NewString,'</span>','')
FROM rCTE
ORDER BY ROW_NUMBER() OVER (PARTITION BY YourString ORDER BY Iteration DESC);

答案 1 :(得分:1)

我同意Larnu。跨度标签可以具有其他值。考虑到字符串可能具有多个span标签,我们可以在下面尝试

DECLARE @String VARCHAR(MAX) = 'C<sub>7</sub>H<sub><span style="font-size: 10px;">8</sub>O<sub>3</sub>S.H<sub>2</sub>O'

;WITH CTE AS
(
    SELECT @String AS Formula
    WHERE @String LIKE '%<span%'

    UNION ALL

    SELECT STUFF(Formula, CHARINDEX('<span', Formula, 1), CHARINDEX('>', Formula, CHARINDEX('<span', Formula, 1))-CHARINDEX('<span', Formula, 1)+1, '') 
    FROM CTE
    WHERE Formula LIKE '%<span%'

)
SELECT TOP 1 Formula 
FROM CTE
ORDER BY LEN(Formula)