2015-09-29 17 views
8

を私はいくつかのレコードを選択しようとすると、テーブルから演算子は存在しません:JSON = JSON

SELECT * FROM movie_test WHERE tags = ('["dramatic","women", "political"]'::json) 

SQLコードが

LINE 1: SELECT * FROM movie_test WHERE tags = ('["dramatic","women",... 
             ^
HINT: No operator matches the given name and argument type(s). You might  need to add explicit type casts. 

********** 错误 ********** 

ERROR: operator does not exist: json = json 
SQL 状态: 42883 
指导建议:No operator matches the given name and argument type(s). You might need to add explicit type casts. 
字符:37 

は、私が何かを欠場か私は学ぶことができましたエラーをキャストこのエラーに関する何か。

答えて

13

json値を比較することはできません。代わりに、テキスト値を比較することができます

SELECT * 
FROM movie_test 
WHERE tags::text = '["dramatic","women","political"]' 

注しかしタイプjsonの値は、それらが与えられている形式のテキストとして保存されていること。もし分解バイナリ形式で格納されているタイプjsonbを使用してこの問題を解決することができる9.4+のPostgresにおいて

SELECT 
    '["dramatic" ,"women", "political"]'::json::text = 
    '["dramatic","women","political"]'::json::text  -- yields false! 

:したがって比較の結果を使用すると、一貫して同じフォーマットを適用するかどうかに依存します。この型の値を比較することができます。

SELECT 
    '["dramatic" ,"women", "political"]'::jsonb = 
    '["dramatic","women","political"]'::jsonb   -- yields true 

ので、このクエリは、はるかに信頼性がある:

SELECT * 
FROM movie_test 
WHERE tags::jsonb = '["dramatic","women","political"]'::jsonb 

JSON Typesについては、こちらをご覧ください。

+3

テキストの比較ではなく、jsonbを使用することを強くお勧めします。テキストの比較では、書式設定などのマイナーな違いによって不均等な結果が報告されるためです。 –

+0

本当にありがとうございます。 – Fudun

+0

ありがとう!他の誰かに役立つ場合は、List.where( "nutrition_constraints :: jsonb - >" vegetarian "? '' 1" ")。 –

関連する問題