• iv uni. L»Ał< i vn oyi-
tość FAl.SE, gdy wartością at jest FALSE. Przeciwne wartości przyjmuje wyrażenie x IS NOT NULL, jest ono prawdziwe, gdy wartość jc jest różna od
NULL.
W punkcie 5.1.2 omawiano wyrażenia zawierające operatory porównania, ich wartością były stałe logiczne FALSE lub TRUE. Takie wyrażenia można było łączyć spójnikami logicznymi AND, OR oraz NOT. Przed chwilą powstała inna sytuacja, gdy z powodu wystąpienia wartości NULL nic można było stwierdzić, czy wyrażenie jest prawdziwe, czy fałszywe i w związku z tym trzeba się posługiwać inną wartością logiczną: UNKNOWN. Należy zatem określić reguły otrzymywania wartości wyrażeń zc spójnikami logicznymi w przypadku kombinowania trzech różnych stałych logicznych.
Reguła jest łatwa do zapamiętania, jeśli przypiszemy stałym logicznym wartości liczbowe: potraktujemy true jako 1 (czyli zupełna prawda), false jako 0 (czyli zupełnie niepraw-da), a UNKNOWN jako 1/2 (czyli coś pomiędzy prawdą i fałszem). A zatem:
1. Koniunkcja AND dwóch wyrażeń logicznych przyjmuje wartość stanowiącą minimum wartości połączonych wyrażeń. To znaczy x AND y ma wartość FALSE, jeśli x lub y ma wartość FALSE; ma natomiast wartość unknown, jeśli żaden z argumentów nie ma wartości false i co najmniej jeden z nich przyjmuje wartość UNKNOWN, oraz ma wartość TRUE jedynie wówczas, gdy oba argumenty x i y przyjmują wartość TRUE.
2. Wartość alternatywy x ORy jest określona jako minimum wartości * i y. To znaczy .r ORy ma wartość TRUE, jeśli x lub y ma wrartość TRUF.; wartość UNKNOWN występuje, jeśli żaden z argumentów' nie ma wartości TRUF. i co najmniej jeden ma wartość unknown, z kolei x ORy ma wartość FALSE jedynie wówczas, gdy oba argumenty mają wartość FALSE.
3. Negację wyrażenia logicznego obliczamy, odejmując od 1 wartość wyrażenia negowanego. To znaczy NOT x przyjmuje wartość TRUE, jeśli x ma wartość FALSE, wartość FALSE, gdy x ma wartość TRUE i wartość unknown, gdy a: jest równe UNKNOWN.
Na rysunku 5.19 przedstawiono tabelę opisującą wyniki trzech działań logicznych w dziewięciu kombinacjach trzech wartości logicznych, które można przyporządkować argumentom. Wartość ostatniego operatora NOT zależ}' tylko od argumentu .r.
Warunki SQL są zapisywane w klauzuli WHERE instrukcji selecl-from--wherc lub delete i dla każdej krotki z przeszukiwanej relacji jest określana
jedna z trzech wartości FALSE, TRUF. lub UNKNOWN. Do wyniku dołącza się tylko te krotki, dla których jest określona wartość true. natomiast pozostałe krotki, które powodują wyliczenie wartości FALSE lub UNKNOWN, są odrzucane. Powoduje to czasem nieoczekiwane sytuacje, o których pisano w ramce zatytułowanej Pułapki związane z NULL.
X |
y |
x AND y |
* OR y |
NOT x |
TRUE |
TRUE |
TRUE |
TRUE |
FALSE |
TRUE |
UNKNOWN |
UNKNOWN |
TRUE |
FALSE |
TRUE |
FALSE |
FALSE |
TRUE |
FALSE |
UNKNOWN |
TRUE |
UNKNOWN |
TRUE |
UNKNOWN |
UNKNOWN |
UNKNOWN |
UNKNOWN |
UNKNOWN |
UNKNOWN |
UNKNOWN |
FALSE |
FALSE |
UNKNOWN |
UNKNOWN |
FALSE |
TRUE |
FALSE |
TRUE |
TRUE |
FALSE |
UNKNOWN |
FALSE |
UNKNOWN |
TRUE |
FALSE |
FALSE |
FALSE |
FALSE |
TRUE |
RYSUNEK 5.19
Tabela wartościowania działań dla logiki trójwartościowej PRZYKŁAD 5.46
Załóżmy, że zapytanie będzie dotyczyć relacji:
Film(tytuł, rok, długość, czyKolor, nazwaStudia, producentC#)
i ma ono następującą postać:
SELECT *
FROM Film
WHERE długość <= 120 OR długość > 120;
Wygląda na to, że do wyniku powinny zostać dołączone wszystkie krotki relacji Film, ponieważ każdy film trwa albo co najmniej 120 minut, albo mniej niż 120 minut.
Jednakże zastanówmy się, co się stanie, jeśli w pewnych krotkach wartość NULL występuje jako składowa długości. Wówczas oba porównania długość <«= 120 i długość > 120 przyjmą wartość UNKNOWN. Z tabeli na rys. 5.19 odczytujemy, że wynik alternatywy dwóch UNKNOWN daje wartość UNKNOWN. Czyli dla każdej krotki, której składową długości jest NULL, wyrażenie z WHERE przyjmuje wartość UNKNOWN. Czyli ta krotka nie zostanie dołączona do wyniku zapytania. W tym przypadku zapytanie oznacza zatem: „wyszukaj wszystkie krotki relacji Film. których składowa długość jest różna od NULL”.
□