Làm thế nào để chuyển đổi sql-text sang jsonb-string?
Dường như không có một cách rõ ràng:
select 'a123'::text::jsonb= LỖI: cú pháp nhập không hợp lệ cho kiểu jsonselect '"a123"'::text::jsonb= XẤU chuỗi vì được trích dẫn
kiểm traselect '"a123"'::text::jsonb = ('{"x":"a123"}'::jsonb)->'x'
để xem rằng không được trích dẫn là chính xác .select '123'::text::jsonb = ('{"x":123}'::jsonb)->'x';= KHÔNG phải chuỗi
Tôi cần '123' và 'a123' dưới dạng chuỗi JSONb thuần túy .
Tái bút: nó không phải là bản sao của chuyển đổi tự động chung chung .
Trả lời
Để chuyển đổi các ký tự chuỗi không định kiểu , không được đặt trong dấu ngoặc kép thành jsonb(hoặc json), hãy sử dụng hàm to_jsonb()(hoặc to_json()):
SELECT to_jsonb(text 'a123');
Lưu ý rằng các đầu vào có phải là một kiểu string ( text, varchar, ...), không phải là một literal untyped. Đó là cách Postgres biết bạn muốn một chuỗi JSON .
Trên đây text 'a123'là một cách để truyền một chữ không định kiểu. Co nhung nguoi khac:
- Truyền kiểu dữ liệu postgres
Đối với truyền trực tiếp tới json(b), Postgres mong đợi các ký tự JSON hợp lệ (với các chuỗi được trích dẫn kép ):
SELECT '"a123"'::jsonb;
Để dịch từng giá trị sang một nguyên thủy JSON cụ thể, bạn có thể truyền có điều kiện trước khi chuyển đổi. Thí dụ:
SELECT p, CASE WHEN i>2 THEN to_jsonb(p::numeric) ELSE to_jsonb(p) END AS x
FROM unnest('{ab,12,12,1.2}'::text[]) WITH ORDINALITY t(p,i);
select '"a123"'::text::jsonb= Chuỗi BAD vì được trích dẫn
Nói chính xác, kết quả không phải là một chuỗi mà là một jsonbgiá trị chứa một chuỗi JSON. Để lấy chuỗi làm kiểu dữ liệu Postgres text, bạn cần ->>toán tử:
select 'a123'::text = ('{"x":"a123"}'::jsonb)->>'x'
Hoặc (so sánh các giá trị JSON):
select '"a123"'::jsonb = ('{"x":"a123"}'::jsonb)->'x';
Tôi cần '123' và 'a123' dưới dạng chuỗi JSONb thuần túy.
Vì thế:
SELECT '"123"'::jsonb, '"a123"'::jsonb;
Cả hai đều chứa chuỗi JSON .
Điều này cũng hoạt động:
SELECT '123'::jsonb;
.. nhưng chứa một số JSON .
Dường như không hiệu quả:
SELECT 'a123'::jsonb; -- error
.. bởi vì nó không phải là một chữ số hợp lệ.
Hướng dẫn này có một bảng ánh xạ giữa các loại JSON Primitive và các loại PostgreSQL tương ứng