Ogni RDBMS a metà strada lo fa allo stesso modo, perché è corretto .
Sto citando il manuale di Postgres qui:
Gli operatori di confronto ordinari producono null (che significa "sconosciuto"), nottrue o false, quando uno dei due input è nullo. Ad esempio, 7 = NULL yieldsnull, così come 7 <> NULL . Quando questo comportamento non è adatto, utilizzare IS [ NOT ] DISTINCT FROM costrutti:
expression IS DISTINCT FROM expression
expression IS NOT DISTINCT FROM expression
Nota che queste espressioni funzionano un po' più lentamente della semplice expression <> expression confronto.
Per boolean valori c'è anche il più semplice IS NOT [TRUE | FALSE] .
Per ottenere ciò che ti aspettavi nella tua seconda query, scrivi:
SELECT * FROM table WHERE avalue IS NOT TRUE; SQL Fiddle.