我在重组数据表方面有一些操作,到目前为止一切顺利 在一个超过50000行的表中,我有文本列,其中文本应该只是数字 现在我想将它转换为整数列 所以:
ALTER TABLE mytable ALTER COLUMN mycolumn TYPE integer;
产生错误42804:* datatype_mismatch *
通过阅读文档,我找到了解决方案:
ALTER TABLE mytable ALTER COLUMN mycolumn TYPE integer USING (TRIM(mycolumn)::integer);
但我知道数字顺序可能不正确,因为这会“掩盖”错误,并且有可能编辑列(手动)。毕竟,可能只是添加了尾随空格或进行了一些其他的小编辑。
我有数据备份 我如何找到给定列的哪个确切单元格包含错误,哪些值无法使用适合在pgadmin中使用的方便查询转换为int?
请查询是否过于复杂。
答案 0 :(得分:3)
扩展@ dystroy的答案,此查询应该咳嗽任何违规行的精确值:
CREATE OR REPLACE FUNCTION convert_to_integer(v_input text)
RETURNS INTEGER AS $$
BEGIN
BEGIN
RETURN v_input::INTEGER;
EXCEPTION WHEN OTHERS THEN
RAISE EXCEPTION 'Invalid integer value: "%". Returning NULL.', v_input;
RETURN NULL;
END;
END;
$$ LANGUAGE plpgsql;
原始答案:
如果以下工作:
ALTER TABLE mytable
ALTER COLUMN mycolumn TYPE integer USING (TRIM(mycolumn)::integer);
然后您应该可以运行以下命令来找到垃圾:
select mycolumn from mytable
where mycolumn::text <> (TRIM(mycolumn)::integer)::text;