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.