我有一个过滤器,用户可以选择操作,例如为,包含,等...否定SQL WHERE条件可空场
- 布布是XOXO转化为
WHERE lower(bubu) = 'xoxo'
SQL WHERE条件。 - bubu包含xoxo转换为
WHERE bubu ILIKE '%xoxo%'
SQL WHERE条件。
现在我已经添加了失活突变体 - 不,不含,等等。我不希望重写了整个WHERE条件,所以我在前面加上NOT
到已经存在的:
- 布布不XOXO转化为
WHERE NOT lower(bubu) = 'xoxo'
SQL WHERE条件。 - bubu不包含xoxo转换为
WHERE NOT bubu ILIKE '%xoxo%'
SQL WHERE条件。
但是,有一个问题。如果布尔是一个可为空的字段,它实际上有NULL,那么负的WHERE条件不会选择它,尽管从人类的角度来看(与SQL相反)NULL值应该满足布尔不是xoxo filter 。
我通过修改原有的积极解决这个问题WHERE条件是这样的:
- 布布是XOXO转化为
WHERE (lower(bubu) = 'xoxo' AND bubu IS NOT NULL)
SQL WHERE条件。
然后,否定收率:
- 布布不XOXO转换成
WHERE NOT (lower(bubu) = 'xoxo' AND bubu IS NOT NULL)
SQL WHERE条件。
而这一次NULL值正确拾取。同样的问题是包含过滤器。
是否有更优雅的解决方案来解决人类如何处理NULL以及SQL如何处理这种不一致?
我使用PostgreSQL 9.2,我不介意有一个特定于此数据库的解决方案。
P.S.
请注意,我想负表达是形式不积极的。
这是不是对我不够好,因为不是从正使用NOT运算产生的负版本。 – mark