我有一個過濾器,用戶可以選擇操作,例如爲,包含,等...否定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