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

藤澤 qsecofr1 @ hotmail.com
2007年 8月 21日 (火) 19:36:04 JST


藤澤です。

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