ユーザーがis、containsなどの操作を選択できるフィルターがあります...
- bubu is xoxo は
WHERE lower(bubu) = 'xoxo'
SQL WHERE 条件に変換されます。 - bubu には
WHERE bubu ILIKE '%xoxo%'
、 SQL WHERE 条件に変換されるxoxo が含まれています。
今、私は負のバリアントを追加しました - is not、does not containなど.. WHERE 条件を最初から書き直したくないので、NOT
既存のものに追加します:
- bubu is not xoxo
WHERE NOT lower(bubu) = 'xoxo'
は、 SQL WHERE 条件に変換されます。 WHERE NOT bubu ILIKE '%xoxo%'
bubu には、 SQL WHERE 条件に変換される xoxo が含まれていません。
ただし、問題があります。bubuが null 許容フィールドであり、実際に NULL が含まれている場合、負の WHERE 条件はそれを選択しませんが、(SQL ではなく) 人間の観点からは、NULL 値はbubu is not xoxoフィルターを満たす必要があります。
この問題を解決するには、元の正の WHERE 条件を次のように変更します。
- bubu is xoxo は
WHERE (lower(bubu) = 'xoxo' AND bubu IS NOT NULL)
SQL WHERE 条件に変換されます。
次に、否定は次のようになります。
- bubu is not xoxo
WHERE NOT (lower(bubu) = 'xoxo' AND bubu IS NOT NULL)
は、 SQL WHERE 条件に変換されます。
今度は NULL 値が正しく取得されます。同じ問題は、containsフィルターにもあります。
人間が NULL を処理する方法と SQL がそれを処理する方法との間のこの不一致を解決するためのより洗練されたソリューションはありますか?
私は PostgreSQL 9.2 を使用していますが、このデータベースに固有のソリューションを用意してもかまいません。
PS
否定的な表現をNOT Positiveの形式にしたいことに注意してください。