Redshift

时间:2018-03-19 21:11:07

标签: sql database amazon-redshift

我试图将某些数据从舞台加载到关系环境中,而且发生了一些我无法弄清楚的事情。

我试图运行以下查询:

SELECT
  CAST(SPLIT_PART(some_field,'_',2) AS BIGINT) cmt_par
FROM
  public.some_table;

some_field是一个列,其数据包含两个由下划线连接的数字,如下所示:

some_field -> 38972691802309_48937927428392

我试图获得第二部分。

那就是说,这是我得到的错误:

[Amazon](500310) Invalid operation: Invalid digit, Value '1', Pos 0, 
Type: Long 
Details: 
 -----------------------------------------------
  error:  Invalid digit, Value '1', Pos 0, Type: Long 
  code:      1207
  context:   
  query:     1097254
  location:  :0
  process:   query0_99 [pid=0]
  -----------------------------------------------;

Execution time: 2.61s
Statement 1 of 1 finished

1 statement failed.

它确实说某些数字不是有效数字。我已经尝试获取正在抛出错误的数据,它看起来像我期待的正常字段。即使我抛出NULL字段也会发生这种情况。

我认为这将是一个编码错误,但我没有找到任何解决方案。 任何人都有任何想法?

谢谢大家。

3 个答案:

答案 0 :(得分:3)

我只是遇到了这个问题并做了一些挖掘。错误Value '1'似乎是一个令人误解的部分,问题实际上是这些字段作为数字无效。

在我的情况下,它们是空字符串。我在this blogpost中找到了解决问题的方法,该方法实质上是查找任何非数字的字段,并在强制转换之前将它们填充为null。

select cast(colname as integer) from
(select
 case when colname ~ '^[0–9]+$' then colname
 else null
 end as colname
 from tablename);

底线:此Redshift错误完全令人困惑,确实需要修复。

答案 1 :(得分:1)

嗯。我首先要调查这个问题。是否有非数字字符?

SELECT some_field
FROM public.some_table
WHERE SPLIT_PART(some_field, '_', 2) ~ '[^0-9]';

bigint的值太长了吗?

SELECT some_field
FROM public.some_table
WHERE LEN(SPLIT_PART(some_field, '_', 2)) > 27

如果您需要超过27位精度,请考虑decimal而不是bigint

答案 2 :(得分:1)

强制转换后错误消失了-CAST(COLUMN1为char(xx))= CAST(COLUMN2为char(xxx))