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

Yumiko Izumi izumi-yumiko @ tokyo.scnet.co.jp
2005年 11月 28日 (月) 16:33:05 JST


お世話になっております。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 メーリングリストの案内