2016-09-19 6 views
0

jsonbではヌルでの注文は実際にはうまくいかないようですか?JSONB nullsとorder by

私はこのようにテーブル内の行数を持っている場合:

key | cae1f6e1-8c1b-4fec-9002-7fd878e0dc06 
value | {"id": "cae1f6e1-8c1b-4fec-9002-7fd878e0dc06", 
     "debit-amount": 207853501, 
     "credit-amount": null} 

をし、私はこのようなクエリを実行すると:

select value->'debit-amount' deb from balance_table 
    order by deb asc 
    nulls last 
    limit 20; 

をそれはまだだけヌル

答えて

0

問題を示していますあなたの質問は次の部分にあります:

order by deb asc 
nulls last 
limit 20; 

の場合はnullのものがすべて最後の行になるようにすべての行をソートすると仮定します。したがって、制限20を行うときにはnull以外のものだけが表示されます。問題は1つだけです.jsonb nullは、SQL nullと同じではありません。

たとえば、ある特定の行がで、"debit-amount": nullであるとします。その場合、value->'debit-amount'はjsonb nullを返します。これは、jsonbでの順序がどのように動作するのかによって、先頭にソートされます。言い換えれば、null(もちろんvalue全体がsql nullである場合を除き)は得られませんので、nulls lastはここでは無意味です。

select value->'debit-amount' deb 
from balance_table 
order by ((value->'debit-amount')='null'::jsonb)::integer, deb asc 
limit 20; 

表現((value->'debit-amount')='null'::jsonb)::integerが1にdebit-amountのすべて(jsonb)null秒に変換されますし、そうでない場合は0を返します。

は、おそらくそのような何かをしたいです。これにより、すべての(jsonb)nullが最後までプッシュされます。

+0

erghhrを...私は実際にnull値が最後であることを確認する必要があります。デビット額がnullのクレジットが常に何か(そしてその逆)であるため、私は '' null ':: jsonb'がpostgresのネイティブ 'nullと同じではないため、<> null(私は思う) 'それはなぜ' nulls last | first'が動作しないのかです。 – Agzam

+0

@Agzam(jsonb)nullを除外しないように答えを更新しましたが、最後にソートしました。 – redneb

0

あなたは'null'::jsonbnullif()nullにキャストすることができます:昇順にソートする場合

select nullif(value->'debit-amount', 'null') deb 
from balance_table 
order by deb asc nulls last 
limit 20;