Postgresql 查找哪一行包含无法转换为整数的值
我在重排列数据表中进行了一些操作,到目前为止效果良好。Postgresql 查找哪一行包含无法转换为整数的值,postgresql,Postgresql,我在重排列数据表中进行了一些操作,到目前为止效果良好。 在一个超过50000行的表中,我有一个文本列,其中文本只能是数字。 现在我想将其转换为整数列。 因此: 这将产生错误42804:*数据类型不匹配* 通过阅读文档,我找到了解决方案: ALTER TABLE mytable ALTER COLUMN mycolumn TYPE integer USING (TRIM(mycolumn)::integer); 但我知道,数据可能不正确的数字顺序,因为这“掩盖”了一个错误,有可能列编辑(手动)
在一个超过50000行的表中,我有一个文本列,其中文本只能是数字。
现在我想将其转换为整数列。
因此: 这将产生错误42804:*数据类型不匹配* 通过阅读文档,我找到了解决方案:
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;
从mytable中选择mycolumn
其中mycolumn::text(TRIM(mycolumn)::integer)::text;
不适用于您的解决方案?有一些技巧,但我仍然不知道如何在所描述的需要中使用它们。我只能在强制转换为int时获得“invalid input SYNTRAX for integer”错误。生成数据类型\u不匹配错误的是什么垃圾?我切换到原始数据,找不到该查询中的错误(持续存在)。我还尝试“从mytable中选择mycolumn,其中不包括mycolumn::integer=index”;知道int-index和text-mycolumn应该代表同一个数字。而且你真的不知道什么样的垃圾会给你这些错误消息?我还成功地尝试了将\u转换为\u integer函数,这是vas推荐的“dystroy”函数。成功转换所有数据的。但clean way仍然告诉我:“错误:列“mycolumn”不能转换为integer类型*********错误*********错误:列“mycolumn”不能转换为integer类型SQL状态:42804”。不,我不知道这是什么原因和在哪里造成的。等等…a)在一种情况下,无法转换为整型,而在另一种情况下,类型不匹配。您能否再次检查并确认您发布的alter table语句实际运行时没有错误?此外,@dystroy的原始convert_to_integer将捕获并清空有问题的行。它的目的是永远成功。(有关拒绝无效输入的版本,请参阅我的更新答案。)
select mycolumn from mytable
where mycolumn::text <> (TRIM(mycolumn)::integer)::text;