@Igorは非常に正しく、いくつかのOR
'ed式は高速でシンプルです。
列の長いリストの場合(a
、b
、c
、d
、e
、f
、g
例では)、これは短く、同じくらい高速です:
CHECK (NOT (a,b,c,d,e,f,g) IS NULL)
db<>ここでフィドル
古いSQLフィドル。
どのように機能しますか?
上記のより詳細な形式は次のようになります:
CHECK (NOT ROW(a,b,c,d,e,f,g) IS NULL)
ROW
ここでは冗長な構文です。
ROW
のテスト IS NULL
を使用した式 のみ レポートTRUE
すべての単一列の場合 NULL
です -これはまさに私たちが除外したいものです。
この式を(a,b,c,d,e,f,g) IS NOT NULL
で単純に逆にすることはできません。 、これは、すべての列がIS NOT NULL
であることをテストするためです。 。代わりに、式全体をNOT
で否定してください 。 Voilá。
詳細については、こちらとこちらのマニュアルをご覧ください。
フォームの表現:
CHECK (COALESCE(a,b,c,d,e,f,g) IS NOT NULL)
同じことを実現しますが、エレガントさは劣りますが、大きな制限があります。一致するデータ型の列でのみ機能します。 、ROW
のチェック中 式は任意ので機能します 列。