2

テーブルを並べています。フィドルはここにあります。

CREATE TABLE test
(
field date NULL
);

INSERT INTO test VALUES
('2000-01-05'),
('2004-01-05'),
(NULL),
('2008-01-05');

SELECT * FROM test ORDER BY field DESC;

私が得る結果:

2008-01-05
2004-01-05
2000-01-05
(null)

ただし、結果を次のようにする必要があります。

(null)
2008-01-05
2004-01-05
2000-01-05

したがって、NULL 値は、他の値よりも大きいかのように扱われます。そうすることは可能ですか?

4

3 に答える 3

4

「時間の終わり」マーカーを使用して null を置き換えます。

SELECT * FROM test 
ORDER BY ISNULL(field, '9999-01-01') DESC; 
于 2012-06-08T09:55:06.150 に答える
4

最も簡単なのは、最初にソート条件を追加することです。

ORDER BY CASE WHEN field is null then 0 else 1 END,field DESC

または、データ型の最大値に設定してみてください。

ORDER BY COALESCE(field,'99991231') DESC

COALESCE/ISNULL同じ最大値を使用する「実際の」データがない場合は、正常に機能します。その場合、それらを区別する必要がある場合は、最初の形式を使用してください。

于 2012-06-08T09:56:14.130 に答える
1

行ごとの関数を呼び出すクエリには注意してください。スケーリングがうまくいくことはめったにありません。

小さいデータセットでは問題にならないかもしれませんが、データセットが大きくなると問題になります。これは、クエリに対して定期的にテストを実行して監視する必要があります。データベースの最適化は、データがまったく変更されない場合 (非常にまれ) にのみ設定して忘れる操作です。

次のように、人為的なプライマリソート列を導入する方が良い場合があります。

select 1 as art_id, mydate, col1, col2 from mytable where mydate is null
union all
select 2 as art_id, mydate, col1, col2 from mytable where mydate is not null
order by art_id, mydate desc

次にresult_set["everything except art_id"]、プログラムでのみ使用します。

そうすることで、(おそらく) 遅い行ごとの関数を導入せず、代わりに列の高速なインデックス ルックアップに依存しmydateます。そして、高度な実行エンジンは実際にこれら 2 つのクエリを同時に実行し、両方が終了したら結合することができます。

于 2012-06-08T10:05:32.277 に答える