JSONB为空并且按顺序排列

时间:2016-09-19 20:49:18

标签: postgresql sql-order-by jsonb

似乎使用nulls的顺序对jsonb不起作用?

如果我在表格中有很多行,如下所示:

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;

它仍然只显示空值

2 个答案:

答案 0 :(得分:1)

您可以使用nullif()

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

答案 1 :(得分:0)

您的查询存在以下问题:

order by deb asc
nulls last 
limit 20;

您会认为这会对所有行进行排序,使null debit-amount null的行最终结束,以便何时限制20,您可能只会看到非无效的。只有一个问题,jsonb null与sql value不同。

例如,假设某个特定行的"debit-amount": null带有value->'debit-amount'。然后null将返回一个jsonb null,它将被排序到顶部,因为这就是jsonb中的顺序如何工作。换句话说,你永远不会得到一个sql value(除非整个null是sql 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

表达式null会将debit-amount的所有(jsonb)null转换为1,否则将返回0。这会将所有(jsonb)var batchDict = batches.ToDictionary(b => b.BatchId); var documents = _context.DocTable.Where(doc => batchDict.Keys.Contains(doc.BatchId)); BatchViewModels.AddRange(documents.Select(d => new Batch { BatchId = d.BatchId, Time = batchDict[d.BatchId].BatchEnd.TimeOfDay, // you only want the time? HardCopyDestination = d.HardCopyDestination }); 推到最后。