ERROR: operator does not exist: json = json
Hi,
Comparison of 2 values of type jsonb is allowed.
Comparison of 2 values of type json gives an error.
That seems like an oversight -- or is it deliberate?
Example:
select '42'::json = '{}'::json;
--> ERROR: operator does not exist: json = json
(of course, easily 'solved' by casting but that's not really the point)
Thanks,
Erik Rijkers
Erik Rijkers <er@xs4all.nl> writes:
Hi,
Comparison of 2 values of type jsonb is allowed.
Comparison of 2 values of type json gives an error.
That seems like an oversight -- or is it deliberate?
This is because json is just a textual representation, and different
JSON strings can be semantically equal because e.g. whitespace and
object key order is not significant.
Example:
select '42'::json = '{}'::json;
--> ERROR: operator does not exist: json = json(of course, easily 'solved' by casting but that's not really the
point)
To do a proper comparison you have to parse it into a semantic form,
which is what casting to jsonb does.
Thanks,
Erik Rijkers
- ilmari
On 2022-07-08 Fr 07:57, Dagfinn Ilmari Mannsåker wrote:
Erik Rijkers <er@xs4all.nl> writes:
Hi,
Comparison of 2 values of type jsonb is allowed.
Comparison of 2 values of type json gives an error.
That seems like an oversight -- or is it deliberate?
This is because json is just a textual representation, and different
JSON strings can be semantically equal because e.g. whitespace and
object key order is not significant.Example:
select '42'::json = '{}'::json;
--> ERROR: operator does not exist: json = json(of course, easily 'solved' by casting but that's not really the
point)To do a proper comparison you have to parse it into a semantic form,
which is what casting to jsonb does.
Alternatively, if you really need something like this, try
<https://bitbucket.org/adunstan/jsoncmp/src/master/>
(I should probably update it to mark the functions as parallel safe)
cheers
andrew
--
Andrew Dunstan
EDB: https://www.enterprisedb.com