postgresql - 查找哪一行包含无法转换为整数的值

标签 postgresql

我在大量重新排列数据表中进行了一些操作,到目前为止一切顺利。
在一个超过 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?

如果不是太复杂,请查询。

最佳答案

扩展@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;

关于postgresql - 查找哪一行包含无法转换为整数的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20620357/

相关文章:

django - 如何在日期时间字段上过滤 gte、lte 日期?

database - 查询超过 1500 万行的最佳方式?

sql - 使用 Postgresql 将来自多个 csv 文件的大量数据插入到不同的表中

ruby-on-rails - Rails 句柄连接表 UniqueViolation

sql - 消除最低 2 个值的滚动平均值的功能?

arrays - Postgres jsonb 将记录集从 UNIX 转换为时间戳

postgresql - 将时钟列 postgresql 转换为日期和小时

sql - .sql 脚本的 PostgreSQL 查询/错误记录

sql - 替换 PostgreSQL 中字符串右侧的字符

sql - 如何使用数据列表从查询中加入数据?