SQL Server:从列中删除一些数据

时间:2013-06-03 07:35:12

标签: sql-server

我的表格带有description列。该栏目中有一些HTML。

然后html传递给页面并渲染它。但有时会有满足的评论,有时它们不会被关闭。我需要清理这些数据。

我通过

找到了它们
select * from table where description like '%<!--%'`  

我认为它不正确,但我不知道如何做得更好。

你能建议解决我的问题吗?

修改
这是一些例子。

<div class="text"> some data </div>
<ul><!-- Some comment -->
  <li>test</li>
  <li>test2</li> <!-- Some comment
</ul>

问候,德米特里。

2 个答案:

答案 0 :(得分:3)

试试这个 -

<强>查询:

DECLARE @temp TABLE
(
      id INT IDENTITY(1,1)
    , [description] NVARCHAR(MAX)
)

INSERT INTO @temp ([description])
VALUES ('
<div class="text"> some data <!--test</div>
<ul>
  <li>test</li>
  <li>test2</li> <!-- Some comment
</ul>')

;WITH cte AS 
(
    SELECT t.id, t.token
    FROM (
        SELECT 
              t.id
            , token = 
                SUBSTRING(
                      t.[description]
                    , number
                    , ABS(CHARINDEX('<', t.[description], number + 1) - number))
        FROM @temp t
        CROSS JOIN [master].dbo.spt_values n
        WHERE [type] = 'p'
            AND number <= LEN(t.[description]) - 1
            AND SUBSTRING(t.[description], number, 1) = '<'
    ) t
    WHERE t.token NOT LIKE '<!--%'
)
UPDATE t
SET [description] = (
    SELECT c.token
    FROM cte c
    WHERE c.id = t.id
    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)')
FROM @temp t

SELECT *
FROM @temp

<强>结果:

<div class="text"> some data </div>
<ul>
  <li>test</li>
  <li>test2</li> 
 </ul>

答案 1 :(得分:1)

使用CASE WHEN检查是否存在打开的注释序列以及是否存在关闭注释序列,并返回一个在必要时添加结束注释的列。

SELECT * ,
  CASE WHEN CHARINDEX('<!--', description) > 0
    AND CHARINDEX('-->', description) = 0 
  THEN description + '-->'
  ELSE description
  END AS clean_description
FROM dbo.[table]

或者,如果您想删除损坏的评论,请使用

SUBSTRING(description, 0, CHARINDEX('<!--', description))

表示语句的THEN分支。