从 WHERE 子句的字符串中排除特定单词

Nel*_*son 3 sql-server ssms t-sql

我有一个存储发票的表,我正在尝试从中获取统计信息,不幸的是,该表构建不佳,一些关键信息都混杂在 nvarchar 字段中,例如发票是否已取消或是否已取消免除费用位于此字段中的一个非常复杂的字符串中,该字符串由前端解析。3453.234;exempt;Invoice Total...

所以我想创建一个排除几个词的查询。我的问题是如何完成一个查询,该查询可以根据关键字列表(已取消、免除)排除记录,因此如果该字段中有任何单词,则不会考虑金额。

blo*_*les 7

构建一个执行它的查询并不太难。首先创建一个使用带有通配符的 LIKE 连接到表的查询。然后从此查询中排除所有内容。

要明白我的意思,请看这个简单的例子:http : //sqlfiddle.com/#!6/619fb/2

或者我在这里复制了一个例子:

--Create tables for comparing data
CREATE TABLE Invoice
(
  InvoiceID INT NOT NULL IDENTITY,
  InvoiceData varchar(200) NOT NULL,
);

CREATE TABLE BadWords
(
  BadWordID INT NOT NULL IDENTITY,
  BadWord varchar(10) NOT NULL
);

--Insert data
INSERT INTO Invoice (InvoiceData)
VALUES ('This is some invoice data'), ('it is about'), ('something interesting that'),
('you should look at'), ('because its got invoice information');

INSERT INTO BadWords (BadWord)
VALUES ('this'),('invoice');

--Test query:
SELECT *
FROM Invoice
WHERE InvoiceID NOT IN (
  SELECT InvoiceID
  FROM Invoice i
  INNER JOIN BadWords b ON i.InvoiceData LIKE '%' + b.BadWord + '%'
)
Run Code Online (Sandbox Code Playgroud)

如果您有数十万行,性能可能会成为问题。没有更多信息,虽然很难为您提供高性能查询(例如,使用 NOT CONTAINS 自由文本查询可能会提供更好的性能)。