我有一个过滤器,用户可以在其中选择is、contains等操作...
- bubu 是 xoxo翻译成
WHERE lower(bubu) = 'xoxo'
SQL WHERE 条件。 - bubu 包含 xoxo转换为
WHERE bubu ILIKE '%xoxo%'
SQL WHERE 条件。
现在我添加了否定变体 - is not,does not contain等。我不想从头开始重写 WHERE 条件,所以我NOT
在已经存在的条件之前添加:
- bubu 不是 xoxo转换为
WHERE NOT lower(bubu) = 'xoxo'
SQL WHERE 条件。 - bubu 不包含 xoxo转换为
WHERE NOT bubu ILIKE '%xoxo%'
SQL WHERE 条件。
但是,有一个问题。如果bubu是一个可以为空的字段并且它实际上包含 NULL,那么否定的 WHERE 条件不会选择它,尽管从人类的角度(与 SQL 相对)来看,NULL 值应该满足bubu is not xoxo过滤器。
我通过修改原来的正 WHERE 条件来解决这个问题,如下所示:
- bubu 是 xoxo翻译成
WHERE (lower(bubu) = 'xoxo' AND bubu IS NOT NULL)
SQL WHERE 条件。
然后,否定产生:
- bubu 不是 xoxo转换为
WHERE NOT (lower(bubu) = 'xoxo' AND bubu IS NOT NULL)
SQL WHERE 条件。
而这一次 NULL 值被正确拾取。contains过滤器也存在同样的问题。
是否有更优雅的解决方案来解决人类如何处理 NULL 与 SQL 如何处理它之间的这种不一致?
我使用的是 PostgreSQL 9.2,我不介意有一个特定于这个数据库的解决方案。
附言
请注意,我希望否定表达式的形式为NOT positive。