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