@Igor ma rację i kilka OR
Wyrażenia ed są szybkie i proste.
Długa lista kolumn (a
, b
, c
, d
, e
, f
, g
w przykładzie), jest to krótsze i równie szybkie:
CHECK (NOT (a,b,c,d,e,f,g) IS NULL)
db<>graj tutaj
Stare skrzypce SQL.
Jak to działa?
Bardziej gadatliwa forma powyższego to:
CHECK (NOT ROW(a,b,c,d,e,f,g) IS NULL)
ROW
jest tutaj zbędną składnią.
Testowanie ROW
wyrażenie z IS NULL
tylko zgłasza TRUE
jeśli każda kolumna jest NULL
- co jest dokładnie tym, co chcemy wykluczyć.
Nie można po prostu odwrócić tego wyrażenia za pomocą (a,b,c,d,e,f,g) IS NOT NULL
, ponieważ sprawdziłoby to, że każda pojedyncza kolumna IS NOT NULL
. Zamiast tego zanegować całe wyrażenie za pomocą NOT
. Voila.
Więcej szczegółów w instrukcji tutaj i tutaj.
Wyrażenie postaci:
CHECK (COALESCE(a,b,c,d,e,f,g) IS NOT NULL)
osiągnąłby to samo, mniej elegancko iz poważnym ograniczeniem:działa tylko dla kolumn pasującego typu danych , podczas gdy sprawdzenie ROW
wyrażenie działa z dowolnym kolumny.