Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 查找哪一行包含无法转换为整数的值_Postgresql - Fatal编程技术网

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;