我有一个存储发票的表,我正在尝试从中获取统计信息,不幸的是,该表的构建很差,并且一些关键信息都混杂在 nvarchar 字段中,例如发票是否已被取消或部分信息费用的一部分是豁免的,该字段以非常花哨的字符串形式驻留在该字段中,该字符串由前端解析。3453.234;exempt;Invoice Total...
所以我想创建一个排除几个单词的查询。我的问题是如何完成一个查询,该查询可以根据关键字列表(取消、豁免)排除记录,因此如果该字段中有任何单词,则不会考虑金额。
我有一个存储发票的表,我正在尝试从中获取统计信息,不幸的是,该表的构建很差,并且一些关键信息都混杂在 nvarchar 字段中,例如发票是否已被取消或部分信息费用的一部分是豁免的,该字段以非常花哨的字符串形式驻留在该字段中,该字符串由前端解析。3453.234;exempt;Invoice Total...
所以我想创建一个排除几个单词的查询。我的问题是如何完成一个查询,该查询可以根据关键字列表(取消、豁免)排除记录,因此如果该字段中有任何单词,则不会考虑金额。
构建一个执行它的查询并不难。首先使用带通配符的 LIKE 创建一个连接表的查询。然后从此查询中排除所有内容。
要明白我的意思,请看这个简单的例子:http ://sqlfiddle.com/#!6/619fb/2
或者,我在这里复制了一个示例:
如果您有数十万行,性能可能会成为问题。如果没有更多信息,虽然很难为您提供高性能查询(例如,使用 NOT CONTAINS 自由文本查询可能会提供更好的性能)。
全文搜索是索引复杂字符串的一种更丰富的方法。我知道您的案例不包含散文,但 FTS 可能仍然适合您。
作为通配符搜索的替代方法,您可以将连接的值拆分为单独的部分。有很多方法可以实现这一点;阅读此链接将引导您找到适合的链接。然后,您可以按集合方式处理您的数据。这假设 nvarchar 中的位置是一致的,或者至少是明确定义的。
无论哪种方式,您每次运行查询时都可能以表扫描结束 a) 如果谓词中有前导通配符,解析器将不使用索引,或者 b) 您必须先拆分值,然后才能过滤它们.
如果您能够以某种方式设法索引包含拆分值的视图,那么它可能会充分执行。