Redshift上的数字无效

Mau*_*ges 8 sql database amazon-redshift

我正在尝试从舞台到关系环境加载一些数据,而且正在发生一些我无法弄清楚的事情.

我正在尝试运行以下查询:

SELECT
  CAST(SPLIT_PART(some_field,'_',2) AS BIGINT) cmt_par
FROM
  public.some_table;
Run Code Online (Sandbox Code Playgroud)

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

some_field -> 38972691802309_48937927428392
Run Code Online (Sandbox Code Playgroud)

而我正试图获得第二部分.

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

[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.
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢大家.

sze*_*lin 5

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

就我而言,它们是空字符串。我在此博客文章中找到了解决我的问题的方法,该方法实质上是查找任何非数字的字段,并在投射前将它们填充为null。

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

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


Gor*_*off 1

嗯。我将从调查这个问题开始。是否有非数字字符?

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

对于 a 来说该值是否太长bigint

SELECT some_field
FROM public.some_table
WHERE LEN(SPLIT_PART(some_field, '_', 2)) > 27
Run Code Online (Sandbox Code Playgroud)

如果您需要超过 27 位的精度,请考虑使用 adecimal而不是bigint