[pgsql-jp: 36456] Re: CASE文について

水沼寛喜 mizunuma @ m-design.com
2005年 11月 28日 (月) 16:48:17 JST


お世話になっております。水沼です。

板垣様、kuniyoshi様、IZUMI様 お返事を頂きありがとうございます。

テーブルのenq65の型はvarcharでした。

その為、正しくCASE文の実行が期待通りにならないのを
確認致しました。

今後同じような事で悩んだ人の為に・・・

●修正したSQL文
SELECT cid, largeq, enq65, CASE WHEN to_number(enq65,999) BETWEEN 2 AND 8
THEN 1 ELSE 0 END FROM kenqt WHERE cid = '235' AND largeq = '2' AND del_flag
IS NULL;

ご教授頂きありがとうございました。

> -----Original Message-----
> From: pgsql-jp-bounces @ ml.postgresql.jp
> [mailto:pgsql-jp-bounces @ ml.postgresql.jp] On Behalf Of Yumiko Izumi
> Sent: Monday, November 28, 2005 4:33 PM
> To: PostgreSQL Japanese Mailing List
> Subject: [pgsql-jp: 36455] Re: CASE文について
>
>
> お世話になっております。IZUMIです。
>
> 板垣さんがおっしゃっているように、"enq65"カラムは数値型では
> ないですよね?
>
> とすると、水沼さんが望む結果を得るにはキャストが必要だと思います。
> 試してみたので参考になさってください。
>
> まず、テストテーブルを作成し、データを挿入。
> ------------------------------------------------------------
> test=# create table test(a integer,b integer,c varchar(5));
> CREATE TABLE test=# insert into test(a,b,c)
> values(235,2,'29'); INSERT 276137 1 test=# insert into
> test(a,b,c) values(235,2,'13'); INSERT 276143 1 test=# insert
> into test(a,b,c) values(235,2,'31'); INSERT 276144 1 test=#
> select * from test;
>   a  | b | c
> -----+---+----
>  235 | 2 | 29
>  235 | 2 | 13
>  235 | 2 | 31
> (3 rows)
> ------------------------------------------------------------
>
> 次に、水沼さんのSQL文を実行、同じ結果に。
> ------------------------------------------------------------
> test=# select a,b,c,case when c between '2' and '8' then 1
> else 0 end from test;
>   a  | b | c  | case
> -----+---+----+------
>  235 | 2 | 29 |    1
>  235 | 2 | 13 |    0
>  235 | 2 | 31 |    1
> (3 rows)
> ------------------------------------------------------------
>
> 次に、板垣さんとはちょっとやり方が違いますが、キャストして
> 実行。
> 数値の範囲指定なので、betweenの「2」と「8」は「'」で囲む必要は
> ありません。
> ------------------------------------------------------------
> test=# select a,b,c,case when to_number(c,'999') between 2
> and 8 then 1 else 0 end from test;
>   a  | b | c  | case
> -----+---+----+------
>  235 | 2 | 29 |    0
>  235 | 2 | 13 |    0
>  235 | 2 | 31 |    0
> (3 rows)
> ------------------------------------------------------------
>
> ついでに、「between 2 and 8」に入るデータを追加して確認。
> ------------------------------------------------------------
> test=# insert into test(a,b,c) values(235,2,2);
> INSERT 276169 1
> test=# select a,b,c,case when to_number(c,'999') between 2
> and 8 then 1 else 0 end from test;
>   a  | b | c  | case
> -----+---+----+------
>  235 | 2 | 29 |    0
>  235 | 2 | 13 |    0
>  235 | 2 | 31 |    0
>  235 | 2 | 2  |    1
> (4 rows)
> ------------------------------------------------------------
>
> こんな感じでいかがでしょうか?
>
> 以上です。
>
>
>
> > お世話になっております。水沼です。
> >
> > CASE文で以下の様なSQL文を放っているのですが、
> > 期待する様な結果になりません。
> >
> > ●実行したSQL文
> > SELECT cid, largeq, enq65, CASE WHEN enq65 BETWEEN '2' AND
> '8' THEN 1
> > ELSE 0 END FROM kenqt WHERE cid = '235' AND largeq = '2'
> AND del_flag
> > IS NULL;
> >
> >  cid | largeq | enq65 | case
> > -----+--------+-------+------
> >  235 |      2 | 29    |    1
> >  235 |      2 | 29    |    1
> >  235 |      2 | 13    |    0
> >  235 |      2 | 19    |    0
> >  235 |      2 | 31    |    1
> >  235 |      2 | 38    |    1
> >
> >
> > ●期待する結果
> > 上記の様なSQL文ですと
> >
> >  cid | largeq | enq65 | case
> > -----+--------+-------+------
> >  235 |      2 | 29    |    0
> >  235 |      2 | 29    |    0
> >  235 |      2 | 13    |    0
> >  235 |      2 | 19    |    0
> >  235 |      2 | 31    |    0
> >  235 |      2 | 38    |    0
> >
> > となるはずですが、何故ならないのでしょうか?
> >
> > ●環境
> >
> > OS:REDHAT7.3
> > PostgreSQL:PostgreSQL 7.2.8
> >
> > ご教授の程、よろしくお願い致します。
> >
> > ------------------------------------
> > 株式会社エム・ディ−・シ−   水沼 寛喜
> > mizunuma @ m-design.com
> > 〒212-0012   川崎市幸区中幸町3-2
> > TEL:044-555-3185 FAX:044-555-5700
> > ------------------------------------
> >
> >
>
>





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