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