Sql 如何查询数据库字段而忽略HTML标记?

Sql 如何查询数据库字段而忽略HTML标记?,sql,html,search,Sql,Html,Search,我们有一个字段,其中包含用于在网站上格式化的HTML标记,但我们只需要查询应该在屏幕上呈现的文本,而不是CSS标记、标记名、属性名等 有没有办法忽略SQL查询或存储过程中的标记权限?如果有办法做到这一点,我们以后会有性能问题吗 我的猜测是,有一种方法可以使用尖括号来解析可搜索文本的字段。这里有一个用户定义的函数,您可以利用它: 这样的处理不应该在数据库中完成。我建议创建一个只包含文本内容的单独字段 针对@Nissan Fans的评论:在我看来,从HTML中提取文本不是数据库的工作。它的工作太复杂

我们有一个字段,其中包含用于在网站上格式化的HTML标记,但我们只需要查询应该在屏幕上呈现的文本,而不是CSS标记、标记名、属性名等

有没有办法忽略SQL查询或存储过程中的标记权限?如果有办法做到这一点,我们以后会有性能问题吗


我的猜测是,有一种方法可以使用尖括号来解析可搜索文本的字段。

这里有一个用户定义的函数,您可以利用它:


这样的处理不应该在数据库中完成。我建议创建一个只包含文本内容的单独字段


针对@Nissan Fans的评论:在我看来,从HTML中提取文本不是数据库的工作。它的工作太复杂,变量太多。我不擅长读取存储过程,但如果我正确读取了代码,如果您可以在查询中运行正则表达式,则会遇到(无效但仍经常发生)未编码的
问题,您可以使用以下示例删除HTML并仅返回文本:

如果您尝试为其中一列编制索引,并通过删除HTML来访问它:

WHERE dbo.anyRemoveHtml(yourColumn)='your search text'
索引将不被使用,您将进行表扫描。当应用程序几乎没有数据时,这可能不是问题,但当更多数据添加到表中时,将导致越来越慢的选择


注意:dbo.anyRemoveHtml只是一个虚构的名称,表示您选择用来删除HTML的函数,实际上并不存在

我同意Pekka的观点;这不是您的数据库应该处理的问题

反对在数据库中执行此解析:

  • 性能问题。使用UDF会降低性能并导致表扫描。即使你避免了表扫描,你仍然要求DB做一些它没有设计好的事情(字符串操作)

  • 很难做到正确。正确解析HTML是一项艰巨的工作。的确,使用UDF可以实现95%的目标,但是在应用层处理这一点可以实现100%的目标

  • 更难测试。我更愿意为HTML剥离代码编写单元测试,这些代码在C#中针对字符串文本执行,而不必往返于数据库

  • 如果必须在数据库中执行此操作…

    如果在DB中这样做是必需的,请考虑这种方法:

  • 在数据库中添加第二个字段以保存内容的纯文本版本

  • 添加触发器,以便每次更改HTML值时,都会重新生成文本版本

  • 针对纯文本字段编写查询


  • 您将获得更好的性能,因为您只在写入时进行解析,而不是在每次搜索时进行解析,而且您的数据库将更好地利用您在纯文本字段上定义的任何索引。

    复制数据,因为您必须查询数据的子集,这似乎是不规则的。这就像将日期分解为每个组件,因为有人只想查询月份。如果这不是一个超大规模的数据库,那就不成问题。这是一个好主意,每次查询时剥离html肯定会很慢。它还将用于存储相同信息的空间增加一倍。还有很多其他的事情要考虑…也许这种搜索是一种每5000次使用HTML数据就使用一次的功能?想象一下,一个应用程序正在显示一个带有标签的数据列表,但允许文本搜索,如果每个应用程序都使用的话,这种搜索很少出现。没有足够的背景来证明这一点。除此之外,我的异议与他关于单独字段的陈述无关,而与这样的事实有关,即查询这样的数据正是数据库的目的。@Nissan Fan,你的观点是正确的。不过,在这种情况下,我认为DB不是合适的地方。请看我的最新答案。我认为您完全正确,这是一个太复杂的处理过程,无法强加给数据库。如果我搜索了更多的行,如果这些行的内容比它们更重要,我会这样做。在我的例子中,虽然这是一个包含可疑数据的描述字段,但在我们测试了一个简单的函数并查看括号后,一切正常。因此,这个答案是+1,但我们使用了@Nissan Fan链接的简单函数。我想这样的函数会更难,但通读它让我意识到,假设我有格式良好的HTML,这应该总是可行的。我们正在测试这一点。谢谢每次你试图用正则表达式解析HTML时,上帝都会杀死一只小猫。幸运的是,没有正则表达式:)虽然解析包含HTML的字段永远不会完美,但这个简单的函数几乎总是完美地工作。谢谢!