[pgsql-jp: 40141] Re: count関数がis nullな行コンストラクタの値をカウントしてしまう
Tatsuo Ishii
ishii @ sraoss.co.jp
2010年 1月 16日 (土) 18:54:02 JST
石井です。
> postgres=# select version();
> version
> ----------------------------------------------------------------
> PostgreSQL 8.4beta2, compiled by Visual C++ build 1400, 32-bit
>
> create table disTest(Val1,Val2) as
> values(null, 1),
> (null,null);
>
> postgres=# select row(Val1,Val2) is null
> postgres-# from disTest;
> ?column?
> ----------
> f
> t
>
> postgres=# select count(row(Val1,Val2))
> postgres-# from disTest;
> count
> -------
> 2
>
> ****************************************************************************
>
> http://www.postgresql.jp/document/current/html/functions-aggregate.html
> count(expression)は、expressionが非NULL値を持つ入力行の個数を返すので
>
> select count(row(Val1,Val2)) from disTest;
> は2でなく1を返すと思いますが、
> 2を返すのが正しい仕様なのでしょうか?
http://archives.postgresql.org/pgsql-hackers/2009-07/msg01553.php
あたりを見てみると、これは正しい振る舞いのようです。
SELECT ROW(foo, bar) IS NULL;
はROWコンストラクタの構成要素(foo, bar)がすべてNULLである場合に真を返
しますが、これはROW(foo, bar)の*値*がNULLであるということと同じではな
りません。なぜならIS NULLは対象がスカラー値の時にだけ適用できるからで、
ROWはスカラー値を返さないため、どうやってその*expressionの値*がNULLな
ることはありません。なので、rowは常にcountのカウント対象になる、という
ことだと思います。
ややこしいですね:-)
--
Tatsuo Ishii
SRA OSS, Inc. Japan
pgsql-jp メーリングリストの案内