[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 メーリングリストの案内