2016-09-18 10 views
0

latとlngの値に基づいてクエリを実行しようとしていますが、値のストアが負の場合に返される行がクエリと一致しません。しかし、私は肯定的な値を照会すると、期待どおりに動作します。私は私のクエリをフォーマットする必要がある特定の方法があるのだろうかと思います。あなたは、私は緯度が40未満であるが、それは何の行を返さない行を見つけようとしています見ることができるようにPostgres 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より大きい値をチェックすると、緯度が-38.19523969999999の行が返されます。

何か助けていただければ幸いです。

答えて

3

次の2つの問題や、おそらく同じ問題の2つのバージョンを持っているが、より正確です。クエリで:

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

'address.coords.latitude'は文字列リテラルではなく、address JSONへのパスです。 '40'も文字列リテラルであり、番号40ではありません。 WHERE句は単純に2つの文字列リテラルを比較しているだけで、のaddress列に埋め込まれているlatitudeを比較していません。

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

をして、2番目のクエリでWHERE句は常に真である:それはあなたの最初のクエリでWHERE句が常に偽であることを意味

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

あなたaddress JSONを掘り下げたい場合

、あなたは #>> operatorを使用したい:

#>>text[]
はspecifieでJSONオブジェクトを取得します。テキスト

としてDパスので、あなたは言うだろう:

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 

+0

すばらしい答え!ありがとうございました – zlwaterfield

0

これが期待どおりに動作しない理由は、JSONテキストとテキスト値を比較するためです。

JSON値を数値である適切な型にキャストし、数値と比較する必要があります。例えば

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

しかし '' address.coords.latitude''はまだ文字列であり、JSONへのパスではありません。 –

関連する問題