web-dev-qa-db-ja.com

Redshiftの無効な数字

私はステージからリレーショナル環境にいくつかのデータをロードしようとしていますが、何かがわかりません。

私は次のクエリを実行しようとしています:

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フィールドをスローしても発生します。

私はそれがエンコーディングエラーだと思ったが、それを解決するための参照を見つけていない。誰もが考えていますか?

みんなありがとう。

8

私はこの問題にぶつかり、少し掘り下げました。エラー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エラーは完全に紛らわしく、実際に修正する必要があります。

5
szeitlin

うーん。問題の調査から始めます。数字以外の文字はありますか?

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を検討してください。

1
Gordon Linoff

キャスト後エラーが消えました-CAST(COLUMN1 as char(xx))= CAST(COLUMN2 as char(xxx))

0