Tôi có một bảng, personschứa hai cột, một cột iddự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 agetrong tài liệu JSON là numberdù 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 textsử 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ì25là một chữ JSON hợp lệ; nhưngJennykhông phải (mặc dù"Jenny"sẽ được).