L’operatore non esiste: json = json

quando provo a selezionare alcuni record da una tabella

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

Il codice sql cast di un errore

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

Mi sono perso qualcosa o dove posso imparare qualcosa su questo errore.

InformationsquelleAutor Isaac | 2015-09-29

 

One Reply
  1. 23

    Non è possibile confrontare json valori. È possibile confrontare i valori di testo anziché:

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

    Di notare, tuttavia, che i valori di tipo json sono memorizzati come testo in un formato in cui sono forniti. Quindi il risultato del confronto dipende da applicare in modo coerente lo stesso formato:

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

    In Postgres 9.4+ è possibile risolvere questo problema utilizzando il tipo di jsonb, che è memorizzato in un decomposto in formato binario. I valori di questo tipo può essere paragonato:

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

    così questa query è molto più affidabile:

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

    Per saperne di più su Tipi JSON.

    • È fortemente preferibile utilizzare jsonb anziché confronti di testo, come un testo di confronto sarà la relazione disparità di risultati a causa di lievi differenze di formattazione etc.
    • Grazie mille, È davvero utile per me !
    • Grazie! Nel caso In cui è utile a chiunque altro, List.where("nutrition_constraints::jsonb -> 'vegetarian' ? '1'").first.

Lascia un commento