繁体   English   中英

Postgres JSONB:按负数查询

[英]Postgres JSONB: query by negative numbers

我试图基于lat和lng值进行查询,但是当值存储为负数时,返回的行与我的查询不匹配。 但是,当我查询正值时,它按预期工作。 我想知道是否需要格式化查询的特定方法。

以下是一些查询示例,以证明结果怪异:

QUERY 1
=======
db_development=# select address from listing where 'address.coords.latitude' < '40';

no rows returned.

QUERY 2
=======
db_development=# select address from listing where 'address.coords.latitude' > '40';

returned address: 
{  
  "city":"Heathmere",
  "state":"VIC",
  "coords":{  
    "latitude":-38.19523969999999,
    "longitude":141.6158994
  },
  "number":"1235",
  "street":"Princes Highway",
  "country":"Australia",
  "zipcode":"3305",
  "formatted":"Riversleigh, 1235 Princes Hwy, Heathmere VIC 3305, Australia"
}

如您所见,我正在尝试查找纬度小于40的行,但是不返回任何行。 但是,当我检查大于40时,它将返回纬度为-38.19523969999999的行。

任何帮助表示赞赏。

您有两个问题,或者同一个问题的两个版本更为准确。 在您的查询中:

select address from listing where 'address.coords.latitude' > '40'

'address.coords.latitude'是字符串文字,而不是address JSON的路径; '40'也是字符串文字,而不是数字40 因此,您的WHERE子句只是比较两个字符串文字,而不是比较address列中嵌入的latitude和数字40 这意味着您的第一个查询中的WHERE子句始终为false:

=> select 'address.coords.latitude' < '40' as correct;
 correct 
---------
 f
(1 row)

并且第二个查询中的WHERE子句始终为true:

=> select 'address.coords.latitude' > '40' as confused;
 confused 
----------
 t
(1 row)

如果您想深入了解address JSON,则可以使用#>>运算符

#>> text[]
以指定的路径获取JSON对象作为文本

所以你会说:

address #>> array['coords', 'latitude']

看内在的latitude ; 如果您或您的工具不喜欢#>>运算符,也可以使用jsonb_extract_path_text函数 然后,您需要将该text值转换为数字,以使比较正常工作并将该数字与纯数字(数字) 40

select address
from listing
where (address #>> array['coords', 'latitude'])::numeric > 40

同样,您的第一个查询:

select address
from listing
where (address #>> array['coords', 'latitude'])::numeric < 40

这无法按预期工作的原因是您正在将JSON文本与文本值进行比较。

您应该将JSON值转换为适当的类型(数字),并与数字进行比较。

例如:

    select address from listing where ('address.coords.latitude')::numeric < 40;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM