簡體   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