[pgsql-jp: 38674] Re: SELECT文、NULL やスペースを含む列でのソートについて
藤澤
qsecofr1 @ hotmail.com
2007年 8月 22日 (水) 08:15:45 JST
ありがとうございます。
意図した通りに並びました。
/藤澤
On Tue, 21 Aug 2007 21:20:46 +0900 (JST)
"渋谷泰宏" <yasuhiro_shibutani @ ybb.ne.jp> wrote:
> 渋谷です。
>
> ORDER句に式を書くといけると思いますよ。
>
> SELECT
> c1,
> c2
> FROM t1
> ORDER BY c2 IS NULL OR TRIM(c2) = '', c1;
>
>
> 07/08/21 に 藤澤<qsecofr1 @ hotmail.com> さんは書きました:
> > 藤澤です。
> >
> > SQL文でソートの書き方が分かりません。どなたか教えて下さい。
> >
> >
> > NULL のデータを含む列の昇順で、データを並べたいのですが、
> > 値がNULL のデータは最後に並んで欲しいのです。
> > -------------------------------------------------------
> > SELECT
> > c1,
> > c2,
> > CASE
> > WHEN c2 IS NULL OR TRIM(c2) = '' THEN 'ZZZZ'
> > ELSE c2
> > END AS c3
> > FROM t1
> > ORDER BY c3, c1;
> > -------------------------------------------------------
> > という書き方では、c2 列に全角の文字列が入るとたちまち
> > 具合悪いですので、max_value なんてのがあればと探してみましたが、
> > 見つかりません。
> > ※Oralce の nvl() や、SQL Serverのisnull() に相当する関数も
> > 見つかりません。
> >
> > -------------------------------------------------------
> > SELECT c1, c2 FROM t1 ORDER BY c2, c1;
> > -------------------------------------------------------
> > と書くと、c2列がNULL のレコードが最後に来ましたが、
> > c2 の値が '' の時にも最後に並んで欲しいので、採用できません。
> > ※そもそも、NULL は値が不明を表すのに、最後に並ぶと考えるのも
> > 妥当では無いように思っています。
> >
> >
> > 今回、分からないことだらけですが、もし何か情報をお持ちの方が
> > いらっしゃいましたら、教えて下さい。
> > よろしくお願いします。
> >
> >
> >
> > ■以下、動作確認を行った時の SQL文です。
> >
> > -- 1. テスト用テーブル作成
> > DROP TABLE IF EXISTS t1 ;
> > CREATE TABLE t1 (
> > c1 VARCHAR(2) PRIMARY KEY,
> > c2 VARCHAR(10)
> > );
> > -- 2. テスト用データ作成
> > INSERT INTO t1 VALUES ('01', NULL);
> > INSERT INTO t1 VALUES ('02', NULL);
> >
> > INSERT INTO t1 VALUES ('11', 'AAAAAAAAAA');
> > INSERT INTO t1 VALUES ('12', 'BBBBBBBBBB');
> > INSERT INTO t1 VALUES ('13', 'CCCCCCCCCC');
> > INSERT INTO t1 VALUES ('14', 'DDDDDDDDDD');
> > INSERT INTO t1 VALUES ('15', 'EEEEEEEEEE');
> >
> > INSERT INTO t1 VALUES ('21', '');
> > INSERT INTO t1 VALUES ('22', '');
> >
> > INSERT INTO t1 VALUES ('23', '全角文字');
> >
> > -- 3. 検索
> > SELECT * FROM t1;
> > -- 3a. Oracleとは違って、'' と NULL は区別される。
> > SELECT * FROM t1 WHERE c2 IS NULL; -- 01, 02
> > SELECT * FROM t1 WHERE c2 = ''; -- 21, 22
> > SELECT * FROM t1 WHERE TRIM(c2) = ''; -- 21, 22
> >
> > -- 3b. NULLの項目を含む列で昇順にソートする時、どう記述すべきか不明。
> > -- 以下では、全角文字が入るとたちまち具合悪い。。。
> > SELECT
> > c1,
> > c2,
> > CASE
> > WHEN c2 IS NULL OR TRIM(c2) = '' THEN 'ZZZZ'
> > ELSE c2
> > END AS c3
> > FROM t1
> > ORDER BY c3, c1;
> >
> >
> >
> > ■環境
> > ------------------------------------
> > ホスト
> > Windows Server 2003 SP2
> > PostgreSQL 8.2.4 (Windows版)
> > UTF8
> > ------------------------------------
> >
> >
> > /藤澤
> >
> >
>
>
> --
> 渋谷 泰宏
pgsql-jp メーリングリストの案内