我试图将某些数据从舞台加载到关系环境中,而且发生了一些我无法弄清楚的事情。
我试图运行以下查询:
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字段也会发生这种情况。
我认为这将是一个编码错误,但我没有找到任何解决方案。 任何人都有任何想法?
谢谢大家。
答案 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))