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.
1. Tạo Bảng Với Kiểu Dữ Liệu 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.
2. Chèn Dữ Liệu JSON
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.
3. Truy Xuất Dữ Liệu JSON
3.1. Truy Xuất Toàn Bộ 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;
3.2. Truy Xuất Một Trường Cụ Thể
Để 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;
3.3. Truy Xuất JSON Lồng Nhau
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;
4. Cập Nhật Dữ Liệu JSON
4.1. Cập Nhật Một Trường Cụ Thể
Để 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.
4.2. Thêm Trường 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.
5. Xóa Dữ Liệu Trong JSON
5.1. Xóa Một Trường Cụ Thể
Để 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';
5.2. Xóa Nhiều Trường
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';
6. Truy Vấn Theo Điều Kiện Với JSON
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.
7. Sắp Xếp Dữ Liệu JSON
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.
8. Chuyển Đổi Giữa JSON và JSONB
PostgreSQL cho phép chuyển đổi giữa các kiểu dữ liệu JSON và JSONB:
- Để chuyển từ JSON sang JSONB: sử dụng
::jsonb
.
- Để chuyển từ JSONB sang JSON: sử dụng
::json
.
Ví dụ:
SELECT details::jsonb FROM products; -- Chuyển JSON sang JSONB
9. Kết Luận
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ế.