Tôi có một bảng, persons
chứa hai cột, một cột id
dựa trên JSONB data
(bảng này vừa được tạo cho mục đích trình diễn để chơi xung quanh với sự hỗ trợ JSON của PostgreQuery).
Bây giờ, giả sử nó chứa hai bản ghi:
1, { name: 'John', age: 30 }
2, { name: 'Jane', age: 20 }
Bây giờ, giả sử tôi muốn có được tên của mọi người trên 25. Điều tôi đã thử là:
select data->'name' as name from persons where data->'age' > 25
Thật không may, điều này dẫn đến một lỗi. Tôi có thể giải quyết nó bằng cách sử dụng ->>
thay vì ->
, nhưng sau đó các phép so sánh không hoạt động như mong đợi nữa, vì không phải là các số được so sánh, mà là các đại diện của chúng dưới dạng chuỗi:
select data->'name' as name from persons where data->>'age' > '25'
Sau đó tôi đã tìm ra rằng tôi thực sự có thể giải quyết vấn đề bằng cách sử dụng ->
và chọn một int
:
select data->'name' as name from persons where cast(data->'age' as int) > 25
Điều này hoạt động, nhưng thật tuyệt khi tôi phải biết loại thực tế (loại age
trong tài liệu JSON là number
dù sao, vậy tại sao PostgreQuery không thể tự mình tìm ra điều đó?).
Sau đó tôi đã nhận ra rằng nếu tôi chuyển đổi thủ công sang text
sử dụng ::
cú pháp, mọi thứ cũng hoạt động như mong đợi - mặc dù hiện tại chúng tôi đang so sánh các chuỗi một lần nữa.
select data->'name' as name from persons where data->'age'::text > '25'
Nếu sau đó tôi thử cái này với tên thay vì tuổi, nó không hoạt động:
select data->'name' as name from persons where data->'name'::text > 'Jenny'
Điều này dẫn đến một lỗi:
cú pháp nhập không hợp lệ cho loại json
Rõ ràng, tôi không nhận được một cái gì đó ở đây. Thật không may, thật khó để tìm thấy bất kỳ ví dụ thực tế nào về việc sử dụng JSON với PostgreSQL.
Có gợi ý nào không?
'Jenny'
với '"Jenny"'
.
data->'name'::text
, bạn đang truyền'name'
chuỗi thành văn bản, không phải kết quả. Bạn không gặp lỗi khi so sánh'25'
vì25
là một chữ JSON hợp lệ; nhưngJenny
không phải (mặc dù"Jenny"
sẽ được).