我正在做一个与某些产品的化学式有关的项目。
数据库中有许多包含<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函数可以删除“ ”和“ > ”之间的所有内容?
谢谢!
答案 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)