【问题标题】:Netezza:ERROR [HY000] ERROR: pg_atoi: error in "[NULL]": can't parse "[NULL]"Netezza:错误 [HY000] 错误:pg_atoi:“[NULL]”中的错误:无法解析“[NULL]”
【发布时间】:2015-01-12 06:35:05
【问题描述】:

我已使用 NZload 从 db2 将文件加载到 Netezza。要首先使用 NZload,我们需要在 Netezza 中创建一个表来接收数据,因此我为此创建了表 Table1,所有列的数据类型为 character varying。我已成功将所有记录加载到此表中。

现在我想将几个列的数据类型更改为 date 以使我能够按月份和年份条件进行搜索。我创建了另一个表Table2,其列的数据类型为date,在尝试将数据从Table1 移动到Table2 时出现错误:

"ERROR [HY000] ERROR: pg_atoi: error in "[NULL]": can't parse "[NULL]" "

我必须怎样做才能成功执行这种数据类型转换?

两个表的 DDL:

CREATE TABLE ID1
   (
      ID          CHARACTER VARYING(100) NULL,
      ID_NUM      CHARACTER VARYING(100) NULL,
      CREATE_TIME CHARACTER VARYING(100) NULL,
      CRT_DTE     CHARACTER VARYING(100) NULL,
      UPDATE_TIME CHARACTER VARYING(100) NULL,
      PLAN_YEAR   CHARACTER VARYING(100) NULL,
      DLV_DTE     CHARACTER VARYING(100) NULL,
      STATUS      CHARACTER VARYING(100) NULL
   );

CREATE TABLE ID2
   (
      ID          INTEGER NULL,
      ID_NUM      INTEGER NULL,
      CREATE_TIME DATETIME NULL,
      CRT_DTE     DATETIME NULL,
      UPDATE_TIME DATETIME NULL,
      PLAN_YEAR   INTEGER NULL,
      DLV_DTE     DATETIME NULL,
      STATUS      CHARACTER VARYING(100) NULL
   );

【问题讨论】:

  • 能否提供两张表的ddl?这种错误通常意味着您在源列中有数据不能隐式转换到目标列
  • 并提供一个示例,说明日期如何在您的摄取 varchar 列中表示。
  • Scott,创建表 ID1(ID 字符变化(100)空,ID_NUM 字符变化(100)空,CREATE_TIME 字符变化(100)空,CRT_DTE 字符变化(100)空,UPDATE_TIME 字符变化( 100) 空,PLAN_YEAR 字符变化(100) 空,DLV_DTE 字符变化(100) 空,状态字符变化(100) 空)
  • Table2:创建表 ID2(ID 整数空,ID_NUM 整数空,CREATE_TIME 日期时间空,CRT_DTE 日期时间空,UPDATE_TIME 日期时间空,PLAN_YEAR 整数空,DLV_DTE 日期时间空,状态字符变化(100)空) ;
  • --Load data insert into ID2 select * from ID1-- Error ("ERROR [HY000] ERROR: pg_atoi: error in "[NULL]": can't parse "[NULL]" " )-- 我已经更改了表 ID1:alter table ID1 alter column update_time datetime;它会导致错误(错误 ^ 发现 "DATETIME" (at char 73) Expecting DROP' or SET')

标签: sql toad netezza


【解决方案1】:

当 Netezza 能够弄清楚如何正确转换字符数据时,它会隐式地将字符列转换为其他数据类型。

例如:

TESTDB.ADMIN(ADMIN)=> insert into id1 values
TESTDB.ADMIN(ADMIN)-> (NULL, NULL , '1999-1-1', '2010-01-31', '2014-12-1', NULL, '1900-01-1', NULL);
INSERT 0 1
TESTDB.ADMIN(ADMIN)=> insert into id2 select * from id1;
INSERT 0 1
TESTDB.ADMIN(ADMIN)=> select * from id2;
 ID | ID_NUM |     CREATE_TIME     |       CRT_DTE       |     UPDATE_TIME     | PLAN_YEAR |       DLV_DTE       | STATUS
----+--------+---------------------+---------------------+---------------------+-----------+---------------------+--------
    |        | 1999-01-01 00:00:00 | 2010-01-31 00:00:00 | 2014-12-01 00:00:00 |           | 1900-01-01 00:00:00 |
(1 row)

但是,根据您的 DDL 和输出,我认为这是对 INTEGER 的转换失败。似乎在您的数据表 ID1 中的某处,有一列包含文本值“NULL”。

TESTDB.ADMIN(ADMIN)=> insert into id1 values 
(NULL, 'NULL', NULL, NULL, NULL, NULL, NULL, NULL);
INSERT 0 1
TESTDB.ADMIN(ADMIN)=> insert into id2 select * from id1;
ERROR:  pg_atoi: error in "NULL": can't parse "NULL"
TESTDB.ADMIN(ADMIN)=>

我建议检查 ID1 中的列以查找字符串“NULL”,并根据需要替换为实际的 NULL。

解决此问题后,您可能会发现 varchar 列中的日期表示由于格式异常而未隐式转换。如果是这种情况,那么您可能需要对 to_date 函数使用显式转换。

【讨论】:

  • Scott:我检查了 Null select * from ID1 where status id '%null%' or where id = null 对于所有列,并且没有显示带有 null 的行。有什么办法,我可以将 id 的数据类型更改为整数和 Update_time 的数据类型,从字符变化到日期时间。如果我们这样做,则无需再次加载到另一个 table2 即 ID2
  • 您无法一步更改列的类型。您必须添加一个新列,将其更新为旧列,删除旧列,然后将新列重命名为旧列的名称。最简单的做法是使用更改后的 DDL 创建一个新表,然后选择插入其中,然后重命名这些表。
  • 连续尝试每一列,找出“坏”数据在哪里: select ID::INTEGER from ID1;从 ID1 中选择 ID_NUM::INTEGER;从 ID1 中选择 CREATE_TIME::TIMESTAMP;等等,让我们看看它在哪一列出错。编辑:时间戳和日期时间是同义词。
  • 有250万条记录,无法检查不良数据
  • 不过,出发点是要知道哪一栏让我们感到悲伤。所以那里的工作与行数无关。如果我们不知道哪些列有问题,您将无法将数据转换为时间戳格式。我的直觉仍然是它是整数列之一。如果您确实运行“从 ID1 中选择计数(ID::INTEGER);从 ID1 中选择计数(ID_NUM::INTEGER);从 ID1 中选择计数(PLAN_YEAR::INTEGER);”让我知道结果。
【解决方案2】:

我已加载到 id2,我将 play_year 更改为字符变化;从 ID2 中选择 id、DLV_DTE、STATUS 其中月(DLV_DTE)= 10 年(DLV_DTE)= 2013

错误:函数“MONTH(TIMESTAMP)”不存在 无法识别满足给定参数类型的函数:

【讨论】:

    猜你喜欢
    • 2022-01-20
    • 1970-01-01
    • 2019-09-14
    • 2015-03-28
    • 1970-01-01
    • 1970-01-01
    • 2017-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多