似乎使用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;
它仍然只显示空值
答案 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
});
推到最后。