[pgsql-jp: 38676] Re: SELECT文、NULL やスペースを含む列でのソートについて
藤澤
qsecofr1 @ hotmail.com
2007年 8月 22日 (水) 09:31:33 JST
忠犬さん、ありがとうございます。
1.
------------------------------------------------
> >c2がnullかnull以外かだけ区別すればいいのに、余計なことを行っている
> >のが問題です。
> SELECT
> c1,
> c2,
> CASE
> WHEN c2 IS NULL OR TRIM(c2) = '' THEN 2
> ELSE 1
> END AS c3
> FROM t1
> ORDER BY c3, c2, c1;
------------------------------------------------
まったく思いつきませんでした。
この記述だと、やりたいことが分かり易くて、ぴったりです。
2.
------------------------------------------------
> >PostgreSQLを含め、多くのRDBMSで実装されている「coalesce(式1,式2)」で
> >代用できるのでは?
------------------------------------------------
COALESCE で NULL値を置き換えできることを確認できました。
SELECT c1, COALESCE(c2, '<null>') from t1
※PostgeSQLを触り始めて初めて COALESCE という関数を知った
のですが、引数を複数指定できるのでピンと来ませんでした。
3.
長さ 0 の文字列の件、SQL Server 2000 でNULLと区別されることを
確認しました。
すべて解決しました。ありがとうございました。
## PostgreSQL の話では無いレベルでした。すみません。
/藤澤
On Wed, 22 Aug 2007 04:22:04 +0900 (JST)
"chuuken kenkou" <ken_ken_1962 @ hotmail.com> wrote:
> 忠犬です。
>
> 少し勘違いがありました。
>
> 前回のメールのSQLでは、以下を見逃してしまいました。
>
> (1)「''」(長さ=0の文字列)も、Oracleのようにnullと同じ値として並べたい
> (2)c2,c1の優先度でソートするが、(1)はそれに優先する
>
> 質問者さんのSQLは、「c3をnullの区別とともに、c2の値も入れてc3で
> ソートする」という考えでしたが、c3はnullの区別だけに使い、c2の値は
> c2を直接見るようにすれば解決できると思います。
>
> <SQL例>
> 1.c3も表示していい場合
>
> SELECT
> c1,
> c2,
> CASE
> WHEN c2 IS NULL OR TRIM(c2) = '' THEN 2
> ELSE 1
> END AS c3
> FROM t1
> ORDER BY c3, c2, c1;
>
> 2.c3は表示したくない場合
>
> SELECT
> c1,
> c2
> FROM t1
> ORDER BY
> CASE
> WHEN c2 IS NULL OR TRIM(c2) = '' THEN 2
> ELSE 1
> END,
> c2, c1;
>
>
> >忠犬です。
> >
> >>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 なんてのがあればと探してみましたが、
> >>見つかりません。
> >
> >c2がnullかnull以外かだけ区別すればいいのに、余計なことを行っている
> >のが問題です。
> >
> > CASE WHEN c2 IS NULL THEN 2
> > ELSE 1
> > END AS c3
> >
> >とすればいいだけではないでしょうか?
> >
> >>※Oralce の nvl() や、SQL Serverのisnull() に相当する関数も
> >> 見つかりません。
> >
> >PostgreSQLを含め、多くのRDBMSで実装されている「coalesce(式1,式2)」で
> >代用できるのでは?
> >
> >>>-- 3a. Oracleとは違って、'' と NULL は区別される。
> >
> >多くのRDBMS(標準SQLも?)は、「長さ0の文字」とnullは、別の値として扱いま
> >す。
> >同じ値として扱うOracleの方が、特異なのです。
> >
> >c3を表示してもいいなら、次のSQLで希望の結果を得られると思います。
> >
> >SELECT c1, c2,
> > CASE WHEN c2 IS NULL THEN 2
> > ELSE 1
> > END AS C3 FROM t1
> >ORDER BY c3, c1;
> >
> >c3を表示したくないなら、次のSQLで希望の結果を得られると思います。
> >
> >SELECT c1, c2
> >FROM t1
> >ORDER BY CASE WHEN c2 IS NULL THEN 2
> > ELSE 1
> > END,
> > c1;
> >
> >
> >
> >
> >>■以下、動作確認を行った時の 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;
> >
> >_________________________________________________________________
> >インターネットを見るなら最新のMSN版IE7で!ダウンロード無料
> >http://promotion.msn.co.jp/ie7/
> >
>
> _________________________________________________________________
> 夏のレジャーに便利な花火大会マップや全国水族館マップはこちら
> http://chizumaga.jp/
pgsql-jp メーリングリストの案内