Postgres:无法从存储 json 数组数据的 bytea 列中提取数据
Postgres : Unable to extract data from a bytea column which stores json array data
我正在尝试从存储 JSON Postgres 11.9 版本数据的 bytea 列中提取数据。
但是,我的代码抛出错误:
错误:类型 json 的输入语法无效
详细信息:令牌“”无效。
上下文:JSON 数据,第 1 行:...
示例数据如下:
create table EMPLOYEE (PAYMENT bytea,NAME character varying);
insert into EMPLOYEE
values ('[{"totalCode":{"code":"EMPLOYER_TAXES"},"totalValue":{"amount":122.5,"currencyCode":"USD"}},{"totalCode":{"code":"OTHER_PAYMENTS"},"totalValue":{"amount":0.0,"currencyCode":"USD"}},{"totalCode":{"code":"GROSS_PAY"},"totalValue":{"amount":1000.0,"currencyCode":"USD"}},{"totalCode":{"code":"TOTAL_HOURS"},"totalValue":{"amount":40.0}}]'::bytea,'Tom')
;
这是我的查询:
SELECT *
FROM EMPLOYEE left outer join lateral
jsonb_array_elements(PAYMENT::text::jsonb) element1 on true ;
请帮助我访问这个数组中的数据。数据的格式始终为 JSON。
对此列使用 bytea 存在限制。
您将 JSON 值存储在 bytea
列中,这让您的生活变得不必要地艰难。仅仅因为这是 Oracle 中推荐的方式,并不意味着这对 Postgres 来说是一个不错的选择。
正确的解决方案是将该列更改为 jsonb
。无论如何,您的应用程序中必须有一个 DBMS 特定层,因为您使用的实际函数和运算符非常不同。
话虽如此,您 可以 使用 convert_from()
方法摆脱这个可怕的选择:
select e.name, element1.*
from employee e
left join lateral jsonb_array_elements(convert_from(PAYMENT, 'UTF-8')::jsonb) element1 on true;
我还认为您应该更改 INSERT 语句以执行从 text
到 bytea
的显式转换,以便您可以确保使用了正确的编码:
insert into employee (payment, name)
values (convert_to('[{...}]', 'UTF-8'),'Tom');
但同样:唯一正确的解决方案是将该列更改为 jsonb
(或至少 json
)
我正在尝试从存储 JSON Postgres 11.9 版本数据的 bytea 列中提取数据。
但是,我的代码抛出错误:
错误:类型 json 的输入语法无效 详细信息:令牌“”无效。 上下文:JSON 数据,第 1 行:...
示例数据如下:
create table EMPLOYEE (PAYMENT bytea,NAME character varying);
insert into EMPLOYEE
values ('[{"totalCode":{"code":"EMPLOYER_TAXES"},"totalValue":{"amount":122.5,"currencyCode":"USD"}},{"totalCode":{"code":"OTHER_PAYMENTS"},"totalValue":{"amount":0.0,"currencyCode":"USD"}},{"totalCode":{"code":"GROSS_PAY"},"totalValue":{"amount":1000.0,"currencyCode":"USD"}},{"totalCode":{"code":"TOTAL_HOURS"},"totalValue":{"amount":40.0}}]'::bytea,'Tom')
;
这是我的查询:
SELECT *
FROM EMPLOYEE left outer join lateral
jsonb_array_elements(PAYMENT::text::jsonb) element1 on true ;
请帮助我访问这个数组中的数据。数据的格式始终为 JSON。 对此列使用 bytea 存在限制。
您将 JSON 值存储在 bytea
列中,这让您的生活变得不必要地艰难。仅仅因为这是 Oracle 中推荐的方式,并不意味着这对 Postgres 来说是一个不错的选择。
正确的解决方案是将该列更改为 jsonb
。无论如何,您的应用程序中必须有一个 DBMS 特定层,因为您使用的实际函数和运算符非常不同。
话虽如此,您 可以 使用 convert_from()
方法摆脱这个可怕的选择:
select e.name, element1.*
from employee e
left join lateral jsonb_array_elements(convert_from(PAYMENT, 'UTF-8')::jsonb) element1 on true;
我还认为您应该更改 INSERT 语句以执行从 text
到 bytea
的显式转换,以便您可以确保使用了正确的编码:
insert into employee (payment, name)
values (convert_to('[{...}]', 'UTF-8'),'Tom');
但同样:唯一正确的解决方案是将该列更改为 jsonb
(或至少 json
)