PostgreSQL 14插入JSONB数组字段值报错,求正确插入方法
解决PostgreSQL插入JSONB[]类型字段的错误
你当前的错误源于PostgreSQL数组字面量语法与JSON数组的差异:直接将JSON数组字符串强制转换为JSONB[]时,PostgreSQL会将其识别为格式错误的数组——PostgreSQL要求数组元素用{}包裹(而非JSON的[]),且每个元素需是独立的JSONB值。
以下是两种可行的解决方案:
方案1:使用ARRAY构造函数(推荐)
通过ARRAY构造函数将多个独立的JSONB对象组合成数组,语法清晰且无需复杂转义:
INSERT INTO settings.tbl_settings (sin_product_id, vhr_sys_module_name, vhr_grouping_name, vhr_settings_sys_name, vhr_label, vhr_value, arj_select_items, txt_remarks, vhr_widget_type, sin_settings_category, int_sys_action_id, fk_created_user_id, dtm_created) VALUES (1, 'XO_PURCHASE', 'XO Purchase', 'NEED_XO_PURCHASE_SUPPLIER_SIDE_POSTING', 'Need XO Purchase Supplier Side Posting', 'NO_POSTING', ARRAY[ '{"strSysName":"NO_POSTING","strLabel":"No Posting"}'::JSONB, '{"strSysName":"POSTING","strLabel":"Posting"}'::JSONB ], '', 'SELECTBOX', 2, 0, 1, TO_TIMESTAMP('27-08-2022 17.24.34', 'DD/MM/YYYY HH24:MI:SS') );
方案2:使用PostgreSQL数组字面量格式
若偏好直接用字符串字面量转换,需将JSON数组拆分为独立的JSONB元素,并用{}包裹整个数组:
INSERT INTO settings.tbl_settings (sin_product_id, vhr_sys_module_name, vhr_grouping_name, vhr_settings_sys_name, vhr_label, vhr_value, arj_select_items, txt_remarks, vhr_widget_type, sin_settings_category, int_sys_action_id, fk_created_user_id, dtm_created) VALUES (1, 'XO_PURCHASE', 'XO Purchase', 'NEED_XO_PURCHASE_SUPPLIER_SIDE_POSTING', 'Need XO Purchase Supplier Side Posting', 'NO_POSTING', '{"{\"strSysName\":\"NO_POSTING\",\"strLabel\":\"No Posting\"}","{\"strSysName\":\"POSTING\",\"strLabel\":\"Posting\"}"}'::JSONB[], '', 'SELECTBOX', 2, 0, 1, TO_TIMESTAMP('27-08-2022 17.24.34', 'DD/MM/YYYY HH24:MI:SS') );
补充说明
JSONB[]是JSONB对象的数组,而非“包含JSON数组的单个JSONB值”,必须确保数组中的每个元素都是独立的JSONB对象。- 方案1的
ARRAY构造函数可读性更强,是更推荐的写法。
内容的提问来源于stack exchange,提问作者C47_C0D3R
相关产品推荐
相关产品推荐

