The JSONB containment operator @> helps you check if one JSONB data contains another. It is like asking, "Does this box have everything that this smaller box has inside?"
JSONB containment (@>) operator in PostgreSQL
jsonb_column @> jsonb_value
The left side must be a JSONB column or expression.
The right side is the JSONB value you want to check if it is contained inside the left side.
data contains the key name with value Alice.data @> '{"name": "Alice"}'::jsonbdata has an age key with value 30.data @> '{"age": 30}'::jsonbdata contains an address object with a city key equal to Paris.data @> '{"address": {"city": "Paris"}}'::jsonbThis example creates a table with a JSONB column and inserts three people with different info. Then it selects those whose age is 30 using the @> operator.
CREATE TABLE people (id SERIAL PRIMARY KEY, info JSONB); INSERT INTO people (info) VALUES ('{"name": "Alice", "age": 30, "city": "Paris"}'::jsonb), ('{"name": "Bob", "age": 25, "city": "London"}'::jsonb), ('{"name": "Carol", "age": 30, "city": "Paris", "hobby": "reading"}'::jsonb); SELECT id, info FROM people WHERE info @> '{"age": 30}'::jsonb;
The @> operator works only with JSONB data type, not plain JSON.
It checks if the right JSONB is contained anywhere inside the left JSONB, including nested objects.
Use ::jsonb to cast text to JSONB when writing queries.
The @> operator checks if one JSONB contains another.
It is useful to filter rows based on JSONB content.
Remember to cast strings to JSONB using ::jsonb in queries.
Practice
What does the PostgreSQL @> operator do when used with JSONB data?
Solution
Step 1: Understand the operator's purpose
The@>operator in PostgreSQL is used to check containment between JSONB values.Step 2: Identify the direction of containment
It checks if the JSONB on the left side contains the JSONB on the right side.Final Answer:
Checks if the left JSONB contains the right JSONB -> Option DQuick Check:
JSONB containment = left contains right [OK]
- Confusing which side contains which
- Thinking it merges JSONB objects
- Assuming it deletes data
Which of the following is the correct syntax to check if a JSONB column data contains the JSON {"key": "value"}?
SELECT * FROM table WHERE data ___ '{"key": "value"}'::jsonb;Solution
Step 1: Identify the containment operator
The@>operator checks if the left JSONB contains the right JSONB.Step 2: Apply correct syntax
To check ifdatacontains the JSON, usedata @> '{"key": "value"}'::jsonb.Final Answer:
@> -> Option AQuick Check:
Containment operator = @> [OK]
- Using <@ which reverses containment
- Using -> or ->> which access keys, not contain
- Forgetting to cast string to jsonb
Given the table items with a JSONB column attributes, what will this query return?
SELECT id FROM items WHERE attributes @> '{"color": "red"}'::jsonb;Assuming items contains:
id | attributes
---+-------------------------
1 | {"color": "red", "size": "M"}
2 | {"color": "blue", "size": "L"}
3 | {"color": "red"}
4 | {"size": "S"}Solution
Step 1: Understand the query condition
The query selects rows whereattributescontain the JSON{"color": "red"}.Step 2: Check each row's attributes
Rows 1 and 3 have "color": "red"; rows 2 and 4 do not.Final Answer:
[1, 3] -> Option CQuick Check:
Only rows with color red = [1, 3] [OK]
- Including rows without the key-value pair
- Confusing @> with key existence operator
- Ignoring the JSONB cast requirement
Identify the error in this query that tries to find rows where info JSONB column contains {"active": true}:
SELECT * FROM users WHERE info @> '{active: true}';Solution
Step 1: Check JSON syntax correctness
JSON keys must be enclosed in double quotes, soactiveshould be"active".Step 2: Verify casting and operator
The query is missing::jsonbcast, but the main syntax error is the missing quotes around the key.Final Answer:
JSON keys must be in double quotes -> Option BQuick Check:
JSON keys need double quotes [OK]
- Forgetting double quotes around keys
- Not casting string to jsonb
- Using wrong containment operator
You want to find all rows in products where the details JSONB column contains {"features": {"waterproof": true}} and also the price is less than 100. Which query is correct?
Solution
Step 1: Use correct containment operator and JSON syntax
The@>operator checks ifdetailscontains the given JSON. The JSON must have keys in double quotes and be cast to jsonb.Step 2: Combine with price condition
UseAND price < 100to filter by price.Final Answer:
SELECT * FROM products WHERE details @> '{"features": {"waterproof": true}}'::jsonb AND price < 100; -> Option AQuick Check:
Correct operator, JSON syntax, and price filter [OK]
- Using <@ instead of @>
- Missing quotes in JSON keys
- Incorrect JSONB casting
- Trying to use -> operator for containment
Ready to prove it?
Pass the test and this pattern moves unknown
