web-dev-qa-db-ja.com

Postgres複合フィールドがnull /空かどうかを確認します

postgres複合型 を使用すると、基本的に別のテーブルとして定義される構造を持つフィールドを構築できます。タイプ「person」の「r​​ecipient」という複合フィールドがあります。この受信者フィールドは、私の特定のシナリオでは多くの場合空のままです。複合フィールドが空かどうかを確認する正しい方法は何ですか。私は試した:

_select * from bla where recipient is not null
select * from bla where recipient is null
select * from bla where recipient = null
select * from bla where recipient != null
_

これらのすべてのケースで、何も返されません。では、複合値が空であるかどうかをどのように正しくチェックしますか?

[〜#〜] update [〜#〜]

さらに読んだ後、これは私の問題のようです:

!(x IS NULL) = x IS NOT NULLはすべての場合に当てはまると考えるかもしれません。ただし、例外があります-複合型。複合値の1つのフィールドがNULLで、別のフィールドが_NOT NULL_の場合、両方の演算子の結果はfalseです。 _IS NULL_は、すべてのフィールドがNULLである場合にのみ真です。 _IS NOT NULL_は、すべてのフィールドが_NOT NULL_である場合にのみ真です。いずれの場合でも、両方の演算子はfalseを返します。

Nullのフィールドとそうでないフィールドがあります。複合フィールドのいずれかの項目がnullでない場合、フィールドがNOT NULLとみなされることを望んでいました...それらのすべてがnullでない場合ではありません。各フィールドをチェックする以外にこれを回避する方法はありますか?

22
coderama

IS NULLおよびIS NOT NULLは複合型でも機能するため、これら2つは適切なはずです。

select * from bla where recipient is not null
select * from bla where recipient is null
20
Mureinik

composite値(行/レコード)のすべてではないフィールドがNULLであるケースをキャッチするには:

SELECT *
FROM   bla
WHERE  NOT (recipient IS NULL);

<row-type> is NULLは、allフィールドがTRUEの場合にのみNULLを返します。
<row-type> is NOT NULLは、allフィールドがNOT NULLの場合にのみTRUEを返します。

括弧はオプションです。とにかく、演算子の優先順位は私たちにとって有利です。

NULLの行/レコードのテスト

さまざまなオプションのデモ:

CREATE TEMP TABLE recipient (r text, i int);  -- to register the row type

SELECT recipient
     , recipient IS NULL         AS all_null
     , recipient IS NOT NULL     AS all_notnull
     , NOT recipient IS NULL     AS some_notnull
     , NOT recipient IS NOT NULL AS some_null
FROM (
   VALUES
    (('foo', 1   )::recipient)
  , ((NULL , 2   )::recipient)
  , ((NULL , NULL)::recipient)
   ) AS tbl(recipient);

結果:

 recipient | all_null | all_notnull | some_notnull | some_null
-----------+----------+-------------+--------------+-----------
 (foo,1)   | f        | t           | t            | f
 (,2)      | f        | f           | t            | t
 (,)       | t        | f           | f            | t

SQL Fiddle。

関連:

14