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