3

I have the following table and setup

create table test (
  id serial primary key,
  name text not null,
  meta json
);

insert into test (name, meta) values ('demo1', '{"name" : "Hello"}')

However, when I run this query, this is the result

select * from test;
 id | name  |        meta
----+-------+--------------------
  1 | demo1 | {"name" : "Hello"}
(1 row)

but

select * from test where meta->'name' = 'Hello';
ERROR:  operator does not exist: json = unknown
LINE 1: select * from test where meta->'name' = 'Hello';
                                              ^
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.

-

select * from test where cast(meta->'name' as text) = 'Hello';
 id | name | meta
----+------+------
(0 rows)

and this works

select * from test where cast(meta->'name' as text) = '"Hello"';
 id | name  |        meta
----+-------+--------------------
  1 | demo1 | {"name" : "Hello"}
(1 row)

Can anyone tell me what the relevance of this quote is and why it's not doing a simple string search/comparison? Alternatively, does this have something to do with the casting?

1 Answer 1

7

That's because the -> gets a field not a value, so you need to add the cast to say to postgresql which data type you are after.

So to run your query like you want you need to use the ->> which gets the json element as text see it here on the docs JSON Functions and Operators

So your query should looks like:

select *
  from test 
 where meta->>'name' = 'Hello';

See it working here: http://sqlfiddle.com/#!15/bf866/8

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.