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