得到一个搜索,我现在正在构建我自己版本的查询过滤,例如,布尔搜索。我的意思是我可以做office +sweden,这应该意味着sweden必须存在。我们不能使用布尔搜索的原因以外的问题。
假设我有一个名为documents的表,其中有两个列,content和notes。当我在搜索栏中输入+office +sweden时,我会执行类似于此的操作:
SELECT * FROM documents
WHERE (content LIKE '%office%' or notes LIKE '%office%') AND
(content LIKE '%sweden%' or notes LIKE '%sweden%')到目前为止,这是完全可行的。这只会给我一些文档,其中office 和 sweden位于content或notes的某个位置。
现在,我想做同样的事情,但是用减号。例如,如果我搜索office -sweden,我希望获得包含的所有文档, office和在contents或notes中都不包含 sweden (是的,还有通配符)。
我尝试过多种方法,但没有让它正常工作。例如,我尝试过使用NOT LIKE,但没有让它正常工作:
SELECT * FROM documents
WHERE (content LIKE '%office%' or notes LIKE '%office%') AND
(content NOT LIKE '%sweden%' or notes NOT LIKE '%sweden%')感觉就像or把这个搞砸了。我也尝试过使用AND NOT
SELECT * FROM documents
WHERE (content LIKE '%office%' or notes LIKE '%office%') AND NOT
(content LIKE '%sweden%' or notes LIKE '%sweden%')我对AND NOT寄予厚望,但这也不像预期的那样有效。
希望我想要做的事情是清楚的。获取所有包含office但不包含使用LIKE的sweden的文档。
解决方案
结果发现这些查询本身没有什么问题。查询中有更多可能为null的字段。我在问题中省略了这些字段,以便更容易理解。如果您有可以包含null的字段,请确保像戈登下面所说的那样处理这个问题。
我使用null运算符处理IFNULL字段,如下所示:
SELECT * FROM documents
WHERE (content LIKE '%office%' or notes LIKE '%office%' or nullfield LIKE '%office%') AND
NOT (IFNULL(content, '') LIKE '%sweden%' or IFNULL(notes, '') LIKE '%sweden%' or IFNULL(nullfield, '') LIKE '%sweden%')发布于 2021-04-21 16:00:18
只需使用not like
SELECT *
FROM documents
WHERE (content LIKE '%office%' or notes LIKE '%office%') AND
(content NOT LIKE '%sweden%' and notes NOT LIKE '%sweden%');或者如果你喜欢:
SELECT *
FROM documents
WHERE (content LIKE '%office%' or notes LIKE '%office%') AND
NOT (content LIKE '%sweden%' or notes LIKE '%sweden%');请注意:NOT LIKE和LIKE一样忽略NULL值。因此,如果值可以是NULL,则需要考虑这一点。
https://stackoverflow.com/questions/67199370
复制相似问题