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字段也会发生这种情况.
我认为这将是一个编码错误,但我没有找到任何解决方案.任何人有任何想法?
谢谢大家.
我只是遇到了这个问题,做了一些挖掘。似乎错误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错误完全令人困惑,确实需要修复。
嗯。我将从调查这个问题开始。是否有非数字字符?
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
。