私はステージからリレーショナル環境にいくつかのデータをロードしようとしていますが、何かがわかりません。
私は次のクエリを実行しようとしています:
SELECT
CAST(SPLIT_PART(some_field,'_',2) AS BIGINT) cmt_par
FROM
public.some_table;
Some_fieldは、次のようなアンダースコアで結合された2つの数値を持つデータを含む列です。
some_field -> 38972691802309_48937927428392
そして、私は2番目の部分を取得しようとしています。
とはいえ、ここに私が得ているエラーがあります:
[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フィールドをスローしても発生します。
私はそれがエンコーディングエラーだと思ったが、それを解決するための参照を見つけていない。誰もが考えていますか?
みんなありがとう。
私はこの問題にぶつかり、少し掘り下げました。エラー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エラーは完全に紛らわしく、実際に修正する必要があります。
うーん。問題の調査から始めます。数字以外の文字はありますか?
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
を検討してください。
キャスト後エラーが消えました-CAST(COLUMN1 as char(xx))= CAST(COLUMN2 as char(xxx))