PostgreSQL hỗ trợ rất mạnh mẽ kiểu dữ liệu JSON và JSONB (JSON dưới dạng nhị phân). Điều này giúp bạn có thể lưu trữ và thao tác với dữ liệu JSON trực tiếp trong cơ sở dữ liệu một cách dễ dàng. Bài viết này sẽ trình bày các thao tác cơ bản với dữ liệu JSON trong PostgreSQL, bao gồm cách truy xuất, cập nhật, xóa và thêm dữ liệu vào JSON.
Trước khi thao tác với dữ liệu JSON, chúng ta cần tạo bảng có chứa cột dữ liệu kiểu JSON hoặc JSONB.
CREATE TABLE products ( id SERIAL PRIMARY KEY, name VARCHAR(100), details JSONB );
Trong bảng này, cột details
sẽ chứa dữ liệu JSON của từng sản phẩm.
Dữ liệu JSON có thể được chèn vào bảng giống như các kiểu dữ liệu khác, sử dụng cú pháp JSON trong PostgreSQL.
INSERT INTO products (name, details) VALUES ('Product A', '{"color": "red", "size": "L", "price": 100}'), ('Product B', '{"color": "blue", "size": "M", "price": 150}');
Ở đây, cột details
chứa các thuộc tính như color
, size
, và price
dưới dạng JSON.
Bạn có thể truy xuất toàn bộ nội dung của cột JSON bằng câu lệnh SELECT
.
SELECT details FROM products;
Để truy xuất một trường cụ thể trong dữ liệu JSON, bạn sử dụng các toán tử ->
và ->>
.
->
: Trả về giá trị JSON.->>
: Trả về giá trị dưới dạng văn bản.Ví dụ, để lấy thông tin về màu sắc của sản phẩm:
SELECT details->'color' AS color FROM products;
Nếu bạn muốn giá trị được trả về dưới dạng chuỗi văn bản:
SELECT details->>'color' AS color FROM products;
Nếu dữ liệu JSON có cấu trúc lồng nhau, bạn có thể sử dụng toán tử ->
để truy cập sâu hơn. Ví dụ, giả sử bạn có dữ liệu JSON lồng nhau như sau:
{ "specifications": { "weight": "1kg", "dimensions": { "height": "10cm", "width": "5cm" } } }
Để truy xuất giá trị của height
, bạn sử dụng cú pháp sau:
SELECT details->'specifications'->'dimensions'->>'height' AS height FROM products;
Để cập nhật một trường trong dữ liệu JSON, bạn sử dụng hàm jsonb_set
. Ví dụ, để cập nhật giá của sản phẩm ‘Product A’:
UPDATE products SET details = jsonb_set(details, '{price}', '120') WHERE name = 'Product A';
Ở đây, {price}
là đường dẫn đến trường bạn muốn cập nhật, và '120'
là giá trị mới.
Bạn có thể thêm một trường mới vào dữ liệu JSON bằng cách sử dụng jsonb_set
. Ví dụ, để thêm trường manufacturer
vào sản phẩm:
UPDATE products SET details = jsonb_set(details, '{manufacturer}', '"Company X"') WHERE name = 'Product B';
Chú ý rằng giá trị JSON cần được định dạng đúng, vì vậy '"Company X"'
được đặt trong dấu nháy kép để biểu thị một chuỗi văn bản trong JSON.
Để xóa một trường trong dữ liệu JSON, bạn sử dụng toán tử -
. Ví dụ, để xóa trường size
khỏi sản phẩm ‘Product B’:
UPDATE products SET details = details - 'size' WHERE name = 'Product B';
Bạn cũng có thể xóa nhiều trường cùng lúc bằng cách sử dụng toán tử #-
. Ví dụ, để xóa cả size
và price
:
UPDATE products SET details = details #- '{size}' #- '{price}' WHERE name = 'Product A';
Bạn có thể sử dụng các điều kiện để truy vấn dựa trên dữ liệu JSON. Ví dụ, để truy xuất các sản phẩm có giá lớn hơn 100:
SELECT name, details->>'price' AS price FROM products WHERE (details->>'price')::int > 100;
Trong truy vấn này, giá trị của trường price
được chuyển thành kiểu int
để so sánh.
Bạn có thể sắp xếp kết quả truy vấn dựa trên dữ liệu JSON. Ví dụ, để sắp xếp các sản phẩm theo giá:
SELECT name, details->>'price' AS price FROM products ORDER BY (details->>'price')::int;
Điều này sẽ sắp xếp các sản phẩm theo giá từ thấp đến cao.
PostgreSQL cho phép chuyển đổi giữa các kiểu dữ liệu JSON và JSONB:
::jsonb
.::json
.Ví dụ:
SELECT details::jsonb FROM products; -- Chuyển JSON sang JSONB
PostgreSQL cung cấp rất nhiều công cụ và toán tử mạnh mẽ để làm việc với dữ liệu JSON và JSONB, giúp cho việc lưu trữ và xử lý dữ liệu không có cấu trúc trở nên dễ dàng và hiệu quả. Các thao tác cơ bản như truy xuất, cập nhật, xóa và truy vấn điều kiện với JSON trong PostgreSQL đều rất trực quan và phù hợp với các ứng dụng thực tế.