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