Skip to main content
Documents
Basic SyntaxMath FunctionsDate FunctionsJSON FunctionsDatabasesTables & Schema ManagementString FunctionsTriggersIndexes

PostgreSQL Querying & Filtering JSON Fields

PostgreSQL JSON functions allow you to store, query, and manipulate JSON data within your database tables. They are essential for applications that require a flexible schema or need to process JSON data directly in the database.

Understanding JSON and JSONB

`JSON` and `JSONB` are data types in PostgreSQL used to store JSON data. `JSON` stores data in a text format, while `JSONB` stores data in a decomposed binary format, allowing for efficient indexing and querying.

Usage

JSON functions are used in PostgreSQL to access and filter JSON data stored in columns of type `JSON` or `JSONB`. They enable complex data retrieval and manipulation by providing methods to extract elements, filter arrays, and modify JSON objects.

SELECT json_column->'key'
FROM table_name
WHERE json_column->>'key' = 'value';

In this syntax, `->` is used to extract a JSON object, while `->>` extracts JSON text.

Examples

1. Extracting a JSON Field

SELECT data->'name' AS name
FROM users;

This query extracts the `name` field from the JSON column `data` in the `users` table.

2. Filtering with JSONB

SELECT *
FROM orders
WHERE order_data->>'status' = 'shipped';

Here, the query filters rows in the `orders` table where the `status` key in the `order_data` JSONB column is set to `shipped`.

3. JSONB Array Filtering

SELECT id, info
FROM products
WHERE info->'tags' @> '["electronics"]';

This query selects `id` and `info` from the `products` table where the `tags` array in the `info` JSONB column contains the value "electronics".

4. Updating JSON Data

UPDATE users
SET data = jsonb_set(data, '{address, city}', '"New City"')
WHERE id = 1;

This query updates the `city` field within the `address` object in the `data` JSONB column for the user with `id` 1.

Tips and Best Practices

  • Use JSONB for indexing. Prefer `JSONB` over `JSON` for better performance with indexing and searching.
  • Leverage GIN indexes. Create GIN indexes on JSONB columns to speed up containment queries.
  • Extract with care. Use `->` for JSON objects and `->>` for text extraction to reduce type casting errors.
  • Keep queries specific. Structure your queries to minimize the amount of JSON data processed, improving performance.
  • Consider normalization. For frequently queried JSON fields, consider normalizing the data into separate columns or tables for efficiency.
  • Understand performance differences. `JSONB` is generally faster for read operations due to its binary format, but it may require more storage space.
  • Beware of storage implications. `JSONB` can have increased storage requirements due to its binary representation, so choose the data type based on your specific use case.