[pgsql-jp: 33790] Re: 0かMAX() の行をSELECTしたい

Takao Kato sirius @ jp.fujitsu.com
2004年 7月 30日 (金) 17:45:30 JST


加藤@川崎です。

最初のメールは食後だけに寝惚けていた(カラム名 tosho としてた)りする
のですが、

> ただ、加藤様の例だとMAX()が取れた場合に0があっても
> 0が返らないと思ってしまうのは私の間違いでしょうか。

各カラムに条件文は適用されるので(かなり効率が悪いのは認めますが)max()
の結果は1つであり、toshoVersionがmax()と一致しない場合、ORでつないだ
条件(toshoVersion = 0)が評価されます。そのため max() でも 0 でもない
場合だけ検出されません。
# ところで試されましたか?

参考までに最後にサンプルファイル付けておきます。

と、

-- written by 竹ノ内さん
-- Subject: [pgsql-jp: 33789] Re: 0かMAX() の行をSELECTしたい
>select case minVersion = 0 then minVersion
>       else maxVersion
>    from tosho where (
>         select max(toshoVersion) as maxVersion
>               ,min(toshoVersion) as minVersion from tosho)
>
>では駄目でしょうか

これですと条件文がそもそも記載されていないのでwhere句が成立しません。
エラーになって怒られるだけでしょう。

やるなら、

SELECT * FROM
 tbl origin,
 (SELECT max(toshoVersion) as maxVersion FROM tbl) maxV
WHERE origin.toshoVersion = maxV.maxVersion OR origin.toshoVersion = 0;
 
となるのでは?(case文使ってないし ^^;)


それでは〜
-------------------------------------------------------------
加藤@川崎

>>> サンプル <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$ cat tmp.sql
CREATE TEMP TABLE tbl (
  id int,  -- 通し番号
  toshoVersion int
);

-- max(toshoVersion) = 13 とする
INSERT INTO tbl VALUES (1, 0);
INSERT INTO tbl VALUES (2,10);
INSERT INTO tbl VALUES (3,11);
INSERT INTO tbl VALUES (4, 5);
INSERT INTO tbl VALUES (5,13);
INSERT INTO tbl VALUES (6, 0);
INSERT INTO tbl VALUES (7, 2);
INSERT INTO tbl VALUES (8, 0);
INSERT INTO tbl VALUES (9,10);
INSERT INTO tbl VALUES (10,0);

SELECT * FROM tbl WHERE
 tbl.toshoVersion = (SELECT max(toshoVersion) FROM tbl)
OR
 tbl.toshoVersion = 0;

$ psql
kato=# \i tmp.sql
CREATE
INSERT 40331740 1
INSERT 40331741 1
INSERT 40331742 1
INSERT 40331743 1
INSERT 40331744 1
INSERT 40331745 1
INSERT 40331746 1
INSERT 40331747 1
INSERT 40331748 1
INSERT 40331749 1

 id | toshoversion 
----+--------------
  1 |            0
  5 |           13
  6 |            0
  8 |            0
 10 |            0
(5 rows)

kato=# \q



pgsql-jp メーリングリストの案内