• ベストアンサー

NULLは表示順最下位

NULLの行を最下位にする場合は、下記のようなコードで解決できました。 select * from table order by case when TEST is null then 0 else 1 end Asc 例)  NULL | 1 3 | 2 1 |→  3 2 |NULL これを、時間(HH:MM)をソートする時に、順番が思うように行きません。 3:20 | 1:10 1:10   |→  9:10 9:10 | NULL NULL | 3:20 上記のような順にソートされてしまいます。  1:10 3:20 9:10 NULL の順にするには、何かよい方法はありませんでしょうか?よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

#なんだか元データに問題があるような木もするのですが…。 とりあえず、 select case when 日付 is null then 0 else 1 end As Sortkey ,* from table order by case when 日付 is null then 0 else 1 end Asc を流してみて、Sortkey列にどのような値が出ますか? あと、「日付」の型はDate型ですか?それとも別の型ですか?

sadoru
質問者

お礼

ご返信誠にありがとう御座います。 1. Sortkey列の値 1:10 → 1 3:20 → 1 9:10 → 1 NULL → 0 2. 日付の型は、NVARCHAR です。 以上、よろしくお願いします。

sadoru
質問者

補足

申し訳御座いませんでした。 khazad-leftyさんの御指摘通り、データに問題がありました。 下記の通りで思い通りにソートできました。原因は、NULLと""(空白)がデータにあり、頂いたコードですと、""が認識できなかったようです。私の不手際で御迷惑をお掛けいたしました。 今後ともよろしくお願い致します。 ありがとう御座います。 select * from テーブル order by case when 日付 is null then '2' when 日付 = '' then '1' else 0 end, 日付;

その他の回答 (2)

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.3

SQLCMD(バージョンによってはOSQL)で下記のようにやっても、NULLが 最後尾に出力されませんか? create table tbl ( dt nvarchar(5) ) go insert into tbl values ( NULL ); insert into tbl values ( N'01:10' ); insert into tbl values ( N'03:20' ); insert into tbl values ( N'09:10' ); go select dt from tbl order by case when dt is null then 1 else 0 end, dt; go

sadoru
質問者

お礼

khazad-leftyさんの御指摘通り、データに問題がありました。 下記の通りで思い通りにソートできました。原因は、NULLと""(空白)がデータにあり、頂いたコードですと、""が認識できなかったようです。せっかく頂いたコードですが、勉強にさせて頂きました。ありがとう御座います。 select * from テーブル order by case when 日付 is null then '2' when 日付 = '' then '1' else 0 end, 日付;

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.1

select * from テーブル order by case when 日付 is null then 1 else 0 end, 日付; で行けませんか。

sadoru
質問者

お礼

申し訳御座いませんでした。 khazad-leftyさんの御指摘通り、データに問題がありました。 下記の通りで思い通りにソートできました。原因は、NULLと""(空白)がデータにあり、頂いたコードですと、""が認識できなかったようです。私の不手際で御迷惑をお掛けいたしました。 今後ともよろしくお願い致します。 ありがとう御座います。 select * from テーブル order by case when 日付 is null then '2' when 日付 = '' then '1' else 0 end, 日付;

sadoru
質問者

補足

お返事ありがとうございます。  せっかくお返事を頂いたのですが、依然NULLが先頭にきてしまいます。

関連するQ&A

  • SQL-SELECT文でのソート

    VB2010とmdb(Ms-Access)にてシステムを構築しています。 Select文にて取得したレコードをDatagridviewにて表示しようとしているのですが SQL="SELECT * FROM table ORDER BY ID" 当のシンプルなものだと表示できるのですが 特定の文字列順にソートしたくCASE WHENを使用して SQL = "SELECT * FROM table ORDER BY CASE BUPPIN WHEN '○○' THEN 1 WHEN '△△' THEN 2 ELSE 0 END" のようにSQLを書いてみたのですがデータアタプタにてデータテーブルに結果を入力させる際にエラーが出てしまいます。 構文間違いでしょうか? ご教授お願いします

  • Order by句でバインド変数を使うには?

    SQL文のOrder by句で2つのバインド変数を用いて、ソートする項目・ソート順を決めたいと思い、以下のようなSQLを作成いたしました。 Select row_Number() Over(Order by Case :ITEM When 'PJコード' then PJコード When '部署コード' then 部署コード end Case :LINE When '1' then DESC When '2' then ASC end .... バインド変数を直接Order by句に入れますと、結果は帰ってくるのですが、バインド変数の値がすべて無視されてデータが出力されます。 以上の理由より、Case文にてバインド変数の値を参照し、ソートする項目と順番を決めております。 上記のソースで実行しますとORA-00907:右かっこがありませんというエラーが表示されます。 2つ目のCase文(:LINE)を消し、最初のCase文だけを残して、並び順(DESC・ASC)を埋め込むと、実行される状態になります。 Oracleのバージョンは11gです。 ご回答よろしくお願いいたします。

  • NULL値を含むソート

    MySQL4.0.20を使っています。 以下のようなデータをソートすると NULLが先に表示されます。 これをNULLを最後にして、数値のソートをかけたいです。何か解決策はありますか?2回に分ける方法しかないのでしょうか? nullと非null ◆元データ A --- 5 NULL 2 NULL 3 1 select A from xxx order by A asc; ●望まない結果 A --- NULL NULL 1 2 3 5 ●望む結果 A --- 1 2 3 5 NULL NULL ※話は変わりますが、4.1で日本語EUCの文字化けバグは直っているのでしょうか?

    • ベストアンサー
    • MySQL
  • 複雑な並び替え処理

    select * from data_table order by case status when 'status1' then 1 when 'status2' then 2 when 'status3' then 2 when 'status4' then 3 else 4 end , 登録日 DESC 上記は、status1>status2,status3>status4の優先順位で登録日順にSQLを取得しています。 このSQL文を改良し、status1の場合のみ登録日ではなく更新日順に並び替えた状態で 取得を行いたいです。良い方法はありませんか?

    • ベストアンサー
    • MySQL
  • オーダーNo.毎に集計するSQL

    オーダーNo.毎に集計するSQLを考えているのですが、少しSELECT文法で行き詰まってしまったので教えてください。 オーダーNo.毎にグループ化して、コード別の件数を集計します。 そして、コードが「10」のものが1件でもあれば表示する、というようなことを考えています。 SELECT ORDERNO, SUM(CASE WHEN CODE = 0 THEN 1 ELSE 0 END) AS CODE0, SUM(CASE WHEN CODE = 10 THEN 1 ELSE 0 END) AS CODE10, SUM(CASE WHEN CODE > 0 THEN 1 ELSE 0 END) AS CODEALL FROM DBORDER WHERE SUM(CASE WHEN CODE = 10 THEN 1 ELSE 0 END) > 0 GROUP BY ORDERNO ORDER BY ORDERNO このようにすると、WHEREのところで構文エラーになります。 ここをどのように変えれば意図どおりの動きをするようになるのか知りたいです。 よろしくお願いします。

  • caseを使った条件分岐の加算がうまくいかない

    SQLで条件によって加算するか、しないかを判定したいと思っています。 ■テーブル:test name,flag,number mike,4,1 mike,4,2 mike,5,3 mike,6,4 mike,7,5 mike,8,6 mike,9,7 ■書いたSQL SELECT test.name AS "name", (CASE WHEN flag = '4' THEN sum(number) ELSE NULL END) AS "4", (CASE WHEN flag = '5' THEN sum(number) ELSE NULL END) AS "5", (CASE WHEN flag = '6' THEN sum(number) ELSE NULL END) AS "6", (CASE WHEN flag = '7' THEN sum(number) ELSE NULL END) AS "7", (CASE WHEN flag = '8' THEN sum(number) ELSE NULL END) AS "8", (CASE WHEN flag = '9' THEN sum(number) ELSE NULL END) AS "9" FROM test GROUP BY test.name ■結果 4,5,6,7,8,9 null,null,null,null,null,28 欲しい結果は、フラグが4ののものの合計。flagが「4」の場合は、「3」という結果が返ってきてもらいたいです。 flagが5の場合は、3が返ってきてもらいたいです。 SQLが間違っているのですが、どこが間違っているのかわかりません。どのように修正すればよろしいでしょうか?よろしくお願いします。 環境はSQLiteを使用しています。

  • 別名フィールドの型を指定

    例えば以下のようなSQL文からビューを作成した場合 SELECT CASE WHEN start_date IS NULL THEN '2010-01-01' WHEN start_date = '0000-00-00' THEN '2010-01-01' ELSE start_date END AS end_date FROM table_a start_dateフィールドはdate型ですが、別名が設定されるend_dateはvarchar型になってしまいます。 これをdate型にしてビューを作成する方法はありませんでしょうか。

  • Selectした時のレコードの取得順

    SQL Server2005 で開発しています。 Order by で並び替えてレコードをSelectする際に、 Order by の対象列データが同じ場合は、 どういった順番でレコードが取得できるのでしょうか? TableA No | Data1 | Data2   1| AAA | 100   2| AAA | 200   3| AAA | 300   4| ABC | 400   5| BBB | 500 (Noはクラスタ化PK) 例えば、上のようなテーブルから次のSQLを実行すると  (1)Select * From TableA ;  (2)Select * From TableA Order by Data1 Asc;  (3)Select * From TableA Order by Data1 Asc, No Asc;  (1)(2)(3)全て、次の順で返ってきました。   1| AAA | 100   2| AAA | 200   3| AAA | 300   4| ABC | 400   5| BBB | 500  しかし、(2)のSQLは、データによって  次の順で返ってくることがありました。   3| AAA | 300   1| AAA | 100   2| AAA | 200   4| ABC | 400   5| BBB | 500    1~3レコード目までは全てData1がAAAのレコードですが  特に指定していなくても、No(PK)の順になるのかと思っていました。    なお、レコードができた(Insert順)でもなさそうです。  この、順番は何で決まっているのでしょうか?  

  • AccessVBA NULLについて

    いつもお世話になっております。 AccessVBAでコーディングを始めたのですが、 NULLの判定で分からない点がでてきました。 データベースより If rs.Fields(0) = Null Then Else 区分 = rs.Fields(0) End If この場合、rs.Fields(0)の中身がNULLの場合は rs.Fields(0)のデータを入れるとエラーになるので ELSEで逃がしたいのですが、 中身のデータがNULLにもかかわらずELSEの方を通ってしまいます。 If rs.Fields(0) Is Null Then Else シール = rs.Fields(0) End If こちらかとも思いましたが、オブジェクトが必要とエラーが返ってきました。 NULLをIF分で判定したい場合どのような記述を行えばよいでしょうか。 どうぞよろしくお願い致します。

  • カウントの多い順に表示したい!

    お世話になっております。 これなんですけど。 k_id の多いランキング順に照合しています。 $result = $DB->execute("select distinct k_id from $k_intro_table"); $total=$result->RecordCount(); これの場合の抽出結果は一番上は一番多いk_id の表示はされているんですけど二番目から順不同になってしまいます。 1 50人 2 9人 3 15人 の様な感じです。 抽出した多い順番に ORDER BY を指定することは出来ますか。 多い順に並べる単なるランキングなんですけど出来ません。

    • ベストアンサー
    • PHP