postgres複合型 を使用すると、基本的に別のテーブルとして定義される構造を持つフィールドを構築できます。タイプ「person」の「recipient」という複合フィールドがあります。この受信者フィールドは、私の特定のシナリオでは多くの場合空のままです。複合フィールドが空かどうかを確認する正しい方法は何ですか。私は試した:
_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でない場合ではありません。各フィールドをチェックする以外にこれを回避する方法はありますか?
IS NULL
およびIS NOT NULL
は複合型でも機能するため、これら2つは適切なはずです。
select * from bla where recipient is not null
select * from bla where recipient is null
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
を返します。
括弧はオプションです。とにかく、演算子の優先順位は私たちにとって有利です。
さまざまなオプションのデモ:
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
関連: