2010年1月16日

[pgsql-jp: 40141] Re:count関数がis nullな行コンストラクタの値をカウントしてしまう

石井です。

> 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


投稿者 xml-rpc : 2010年1月16日 18:54
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/92389
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。