PostgreSQL存储过程报错:WHERE参数需为布尔类型,如何正确追加WHERE条件?
解决PostgreSQL存储过程WHERE条件类型不匹配的问题
你遇到的报错argument of WHERE must be type boolean, not type text,是因为jsonb_object_field_text(config, 'Query')返回的是文本类型的字符串,而WHERE子句要求的是布尔类型的条件表达式,直接将文本字符串放在WHERE后会导致类型不兼容。
要实现动态传入WHERE条件的效果,需要使用PL/pgSQL的动态SQL来构造并执行语句,具体方案如下:
修正后的存储过程代码
CREATE OR REPLACE PROCEDURE register(job_id int, config jsonb) LANGUAGE PLPGSQL AS $$ DECLARE v_query text; BEGIN -- 从config中提取查询条件文本 v_query := jsonb_object_field_text(config, 'Query'); -- 构造并执行动态SQL EXECUTE format(' INSERT INTO test (sample1, sample2) SELECT sample1, sample2 FROM test WHERE %s', v_query); COMMIT; END $$;
使用示例
调用存储过程时,传入包含合法WHERE条件的jsonb参数(注意单引号转义):
CALL register(1, '{"Query": "test1 like ''test%''"}'::jsonb);
注意事项
- 确保传入的
Query是合法的PostgreSQL条件表达式,避免语法错误; - 如果
Query来自不可信的输入源,存在SQL注入风险,需要额外做校验或安全处理。
内容的提问来源于stack exchange,提问作者Santosh Madugundi
相关产品推荐
相关产品推荐

