创建表时pg_catalog.btrim(numeric, unknown)函数不存在问题求助
解决PostgreSQL中TRIM函数报错:
function pg_catalog.btrim(numeric, unknown) does not exist 先还原下你的操作场景:你执行了这段SQL来创建表:
CREATE TABLE ref_lab_cohort_level AS SELECT cohort, initcap (TRIM (result_flag)) AS result_flag, TRIM (cohort_level) AS cohort_level FROM temp_labs_levels;
结果触发了错误:
function pg_catalog.btrim(numeric, unknown) does not exist
问题原因
这个报错我之前也碰到过,其实逻辑很明确——PostgreSQL里的TRIM()(底层对应btrim())函数只能处理**字符串类型(text/varchar)**的数据,而错误提示里的numeric说明你的result_flag或者cohort_level列是数值类型(比如int、numeric等),直接对数值列调用TRIM就会触发这个类型不匹配的错误。
解决方法
这里给你两个可行的方案:
方案1:临时转换数据类型再处理
如果只是临时处理数据、不想改动原表结构,直接在TRIM之前把数值列转为字符串类型就行,用::text强制转换修改后的SQL如下:
CREATE TABLE ref_lab_cohort_level AS SELECT cohort, initcap(TRIM(result_flag::text)) AS result_flag, TRIM(cohort_level::text) AS cohort_level FROM temp_labs_levels;
方案2:修改原表列的类型(如果业务允许)
如果result_flag和cohort_level本来就应该存储字符串数据,那最好先修正原表的列类型,从根源避免后续再出类似问题:
-- 修改result_flag为text类型 ALTER TABLE temp_labs_levels ALTER COLUMN result_flag TYPE text; -- 修改cohort_level为text类型 ALTER TABLE temp_labs_levels ALTER COLUMN cohort_level TYPE text; -- 然后再执行你原来的创建表语句 CREATE TABLE ref_lab_cohort_level AS SELECT cohort, initcap(TRIM(result_flag)) AS result_flag, TRIM(cohort_level) AS cohort_level FROM temp_labs_levels;
先确认列类型(可选)
如果你不确定哪一列是数值类型,可以先查一下:
SELECT column_name, data_type FROM information_schema.columns WHERE table_name = 'temp_labs_levels' AND column_name IN ('result_flag', 'cohort_level');
内容的提问来源于stack exchange,提问作者Sachin
相关产品推荐
相关产品推荐

