[pgsql-jp: 38671] Re: SELECT文、NULL やスペースを含む列でのソートについて

渋谷泰宏 yasuhiro_shibutani @ ybb.ne.jp
2007年 8月 21日 (火) 21:05:03 JST


渋谷です。

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