我有一个表,persons
其中包含两列,一个id
和一个基于JSONB的data
列(此表仅出于演示目的而制作,可以与PostgreSQL的JSON支持一起使用)。
现在,假设它包含两个记录:
1, { name: 'John', age: 30 }
2, { name: 'Jane', age: 20 }
现在,假设我想获得每个25岁以上的人的名字。我尝试过的是:
select data->'name' as name from persons where data->'age' > 25
不幸的是,这会导致错误。我可以使用->>
代替来解决它->
,但是比较不会再按预期进行,因为不是比较数字,而是将它们表示为字符串:
select data->'name' as name from persons where data->>'age' > '25'
然后,我发现实际上可以使用->
和强制转换为解决此问题int
:
select data->'name' as name from persons where cast(data->'age' as int) > 25
这行得通,但是我必须知道实际的类型不是很好(age
JSON文档中的类型number
仍然是,所以PostgreSQL为什么不能自己弄清楚呢?)。
然后,我发现,如果我手动转换为text
使用::
语法,那么一切也会按预期工作-尽管我们现在再次比较字符串。
select data->'name' as name from persons where data->'age'::text > '25'
如果我再尝试使用名称而不是年龄来尝试,则不起作用:
select data->'name' as name from persons where data->'name'::text > 'Jenny'
这会导致错误:
json类型的输入语法无效
很明显,我在这里什么都没有。不幸的是,很难找到在PostgreSQL中使用JSON的任何实际示例。
有什么提示吗?
'Jenny'
与'"Jenny"'
。
data->'name'::text
,您正在将'name'
字符串转换为文本,而不是结果。与进行比较时不会出现错误,'25'
因为25
它是有效的JSON文字;但Jenny
不是(尽管"Jenny"
会)。