sql - Postgres JSONB : query by negative numbers

标签 sql postgresql latitude-longitude jsonb

我正在尝试基于纬度和经度值进行查询,但当值存储为负时,返回的行与我的查询不匹配。但是,当我查询正值时,它会按预期工作。我想知道是否需要一种特定的方式来格式化我的查询。

这里有一些示例查询来证明奇怪的结果:

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 子句始终为真:

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

如果你想深入了解你的 address JSON,你想使用 #>> operator :

#>> text[]
Get JSON object at specified path as text

所以你会说:

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

查看嵌入的latitude;你也可以使用 jsonb_extract_path_text function如果您或您的工具不喜欢 #>> 运算符。然后,您需要将该 text 值转换为一个数字以使比较正常进行,并将该数字与普通(数字)40 进行比较:

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

与您的第一个查询类似:

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

关于sql - Postgres JSONB : query by negative numbers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39552867/

相关文章:

用于查找名称的mysql查询包括特殊字符单引号

mysql - SQL,基于变量的日期X和X之间的总和

sql - 将每个用户的最新行转换为列

sql - 使用 SQL 在列中查找缺失的订单

postgresql - 如何在 Npgsql 中使用 hstore 列类型?

mysql - SQL JOIN with And 子句和某些条件

c++ - 通过 C++ 从 sql 表中检索数据

ios - 从照片 iOS swift 中提取 GPS 数据

python - Pandas - 通过插值填充缺失的经纬度坐标

java - 如何从java中的列表中获取最近的纬度经度