在查询中查找导致 postgresql 异常的列。

Posted

技术标签:

【中文标题】在查询中查找导致 postgresql 异常的列。【英文标题】:Finding which column caused the postgresql exception in a query. 【发布时间】:2014-08-29 12:11:31 【问题描述】:

我在 Redshift 中有一个包含大约 200 列的临时表。我首先将数据从 S3 复制到此表,然后使用大型 insert into select from 查询将数据从该表复制到另一个表。 staging table 中的大多数字段都是 varchar,我在查询中将其转换为正确的数据类型。

我在临时表中获得了一些导致数字溢出的字段 -

org.postgresql.util.PSQLException: ERROR: Numeric data overflow (addition)
Detail:
-----------------------------------------------
error:  Numeric data overflow (addition)
code:      1058
context:
query:     9620240
location:  numeric.hpp:112
process:   query1_194 [pid=680]

我怎样才能找到导致此溢出的字段,以便清理输入或更正查询。


【问题讨论】:

【参考方案1】:

我使用 Netezza,它也可以使用正则表达式函数来 grep 行。幸运的是,redshift 也支持正则表达式。请看一下

http://docs.aws.amazon.com/redshift/latest/dg/REGEXP_COUNT.html

因此,您的想法是在 where 子句中使用正则表达式,这样您就可以找到哪些值超出了插入期间发生的数字转换。问题将是查找可让您确定物理文件中的哪些行导致问题的识别数据。您可以创建数据的另一个副本并在临时表中创建行号。使用临时表作为分析源。您要进入的数字字段有多大?如果您将多列转换为数字,则可能需要针对多于 1 列进行此分析。

【讨论】:

以上是关于在查询中查找导致 postgresql 异常的列。的主要内容,如果未能解决你的问题,请参考以下文章

Update语句导致异常行为

如何从 PostgreSQL 的子查询中选择包含值数组的列?

Postgresql 查询的过滤条件中的列上的字符串操作如何影响它选择的计划

SQL查询从postgresql数据库表中具有数组数据类型的列中获取数据。

在 PostgreSQL 中选择具有特定列名的列

在 Laravel 迁移中更改列会导致异常:更改表的列需要 Doctrine DBAL