2016-04-15 6 views
2

JavaのJDBCコネクタを介してテーブルから別の値を選択していますが、NULL値(あれば)が常にResultSetの最初の行であるようです。PostgresのDISTINCT関数は常に最初の要素としてnullを返しますか?

このNULLをリストから削除して、このResultSetをロードする必要があります。ロジックは最初の要素のみを調べ、nullの場合は無視します。

私はクエリでORDER BYを使用していません。そのロジックはまだ信用できますか?私はPostgresのドキュメントでこれについて何も参照することができません。

+1

テーブル定義とクエリを表示します。しかし、一般的には 'order by 'を使用しないと返されるデータの順序に依存しない** –

答えて

1

マニュアルに記載されていない場合、私はそれを信じません。しかし、楽しいとは何のロジックが使用されているのか把握しようとすると、次のクエリを実行すると、(他のすべての値が明白なランダムな順序でNULLを明らかに無作為の順序でNULLをもたらす:

with t(n) as (values (1),(2),(1),(3),(null),(8),(0)) 
select distinct * from t 

ただし、テーブルを変更したバージョンとクロスジョインすると、2つのNULLが上に表示されますが、ランダムなNULLが結果セットを散在させて分散します。したがって、上のすべてのNULL値をクランピングする明確なロジックはないようです。

with t(n) as (values (1),(2),(1),(3),(null),(8),(0)) 
select distinct * from t 
cross join (select n+3 from t) t2 
2

NOT NULLのチェックを追加できます。単にあなたがそれに頼ることができないため、あなたは結果を得るために行くされる順序は保証されませんそして、その後、ORDER BY句を提供していない場合も

​​

のような。だから、それはあなたがreference Postgresql documentを探している場合は、特定の出力での結果出力(すなわち、昇順または降順)

をしたい場合は、ORDER BY句を提供するために、より良く、お勧めです、それは言う:

ORDER BYが指定されていない場合は、システムが最も高速に検索する順序で行が返されます。

+0

私は古いハードウェアで作業しています。できるだけ小さなコストでこのデータにアクセスしたいと思っていました。 ORDER、WHERE条件はありません。最初の行でNULLを使用しても、私には繰り返しはできませんでした。それとも、私が今見ているように。 –

+2

@AdamHorvath:返される行の数を減らすことは、より安価で、不要なデータを返すことになります。特に 'where'は' distinct'より前に評価されるので、 'distinct'は行を減らすことでやることが少なくなります。その 'where'節の有無にかかわらず、選択のコストは本質的に同じになります。列に索引を付けると、パフォーマンスが向上します。 –

関連する問題