W normalnych warunkach porównanie wartości NULL
z dowolną inną wartością daje inną wartość NULL
.PostgreSQL 9.4 - Porównywanie wartości NULL
SELECT NULL = NULL;
Zwraca NULL
trzyma to (w większości) prawdziwe przy porównywaniu dowolnych wierszy, jak wyjaśniono w the documentation, 9.23.5. Row Constructor Comparison:
SELECT ROW(1, NULL, 'baz text') = ROW(1, NULL, 'baz text');
Returns NULL
Jednak przy porównywaniu dobrze zdefiniowanych typów kompozytów wartości NULL
są traktowane jako równe.
CREATE TYPE test_type AS (
foo INTEGER,
bar BIGINT,
baz TEXT
);
SELECT (1, NULL, 'baz text')::test_type = (1, NULL, 'baz text')::test_type;
Zwraca TRUE
Takie zachowanie wydaje się być udokumentowany (Szukałem i znalazłem żadnego odniesienia do zachowań).
Chciałbym użyć tego zachowania, aby zaimplementować niektóre reguły biznesowe i upewnić się, że jest to bezpieczne.
- Czy jest to zgodne z dowolną specyfikacją SQL?
- Czy to prawdopodobnie to zmieni się w przyszłości?
Dla stabilnych wyników zawsze można użyć: 'SELECT ROW (1, NULL, 'bazowy tekst') NIE ODRĘBNA OD WIERSZA (1, NULL," bazowy tekst "); ' – lad2025
@ lad2025 - Znam klauzulę' IS NOT DISTINCT FROM'; jednak ** Interesuje mnie operator '=', gdy jest używany z typami złożonymi **. – losthorse
To jest interesujące, myślę, że porównuje ciąg znaków ** [Demo] (http://sqlfiddle.com/#!15/9eecb7db59d16c80417c72d1e1f4fbf1/5221/1) **. Więc '{" type ":" typ_testu "," wartość ":" (,,) "} = {" typ ":" typ_testu "," wartość ":" (,,) "}' => true – lad2025