2016-09-19 66 views
0

看起來,用nulls命令對jsonb並不真正有效嗎?JSONB nulls and 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; 

你會以爲這個排序的方式,對具有nulldebit-amount將在年底結束,那些讓什麼時候做極限20,你可能會看到唯一的非空的人都行。只有一個問題,jsonb null與sql null不一樣。

例如,假設特定行的與"debit-amount": null。然後value->'debit-amount'將返回一個jsonb null,它將被排序到頂端,因爲這是jsonb中的順序的工作方式。換句話說,你將永遠不會獲得一個SQL 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將轉換所有(jsonb)null S代表debit-amount爲1,否則將返回0。這將推動所有(jsonb)null結束。

+0

erghhr ......其實我需要做的空值按升序排列時是最後一次。我不能這樣做,當<>空(我認爲),因爲當借記金額爲空時,信貸總是東西(反之亦然)我猜'null':: jsonb'不同於postgres的本地'null '這就是爲什麼'nulls last | first'將不起作用 – Agzam

+0

@Agzam我更新了我的答案,以免排除(jsonb)null,而是將它們排序到最後。 – redneb

0

你可以施放'null'::jsonbnullnullif()

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