16
  • データ ウェアハウスとして amazon redshift を使用しています
  • 文字列型のフィールド (field1) があります。4 つの数字で始まる文字列もあれば、文字で始まる文字列もあります。

「テスト アルファ」
「1382 テスト ベータ」

  • 文字列が 4 つの数字で始まらない行を除外したい
  • redshift のドキュメントを見ると、 isnumber または isnumeric が関数であるとは思えません。「いいね」機能が一番可能性が高いようです。
  • 私は試した

    where left(field1, 4) like '[0-9][0-9][0-9][0-9]'

これは機能しませんでした。以下のリンクから、redshift がそれをサポートしていないようです:

https://forums.aws.amazon.com/message.jspa?messageID=439850

「where」句に誤りがありますか? そうでなく、その句がredshiftでサポートされていない場合、フィルタリングする方法はありますか? キャストを使おうと思っていた

cast(left(field1,4) as integer) 

エラーが発生した場合は行を渡しますが、Amazon redshift でこれを行う方法がわかりません。または、isnumeric フィルター用の他のプロキシがあります。

ありがとう

4

8 に答える 8

12

この質問が出されてから長い時間が経ちましたが、適切な回答が見つかりませんでした。そのため、今日 (2016 年 3 月) に Redshift クラスターで問題なく動作するソリューションを共有する義務があると感じています。

UDF 関数は次のとおりです。

create or replace function isnumeric (aval VARCHAR(20000))
  returns bool
IMMUTABLE 
as $$
    try:
       x = int(aval);
    except:
       return (1==2);
    else:
       return (1==1);
$$ language plpythonu;

使用法は次のとおりです。

select isnumeric(mycolumn), * from mytable
    where isnumeric(mycolumn)=false
于 2016-06-03T12:36:41.737 に答える
4

Amazon によると、posix スタイル ~regex スタイルの式は遅いです... https://docs.aws.amazon.com/redshift/latest/dg/pattern-matching-conditions.html

独自のREGEXP_*関数を使用する方が速いようです。 https://docs.aws.amazon.com/redshift/latest/dg/String_functions_header.html

整数の true/false だけをチェックするために、以下を使用して成功しました。 REGEXP_COUNT(my_field_to_check, '^[0-9]+$') > 0

これは、数値のみの場合は 1 を返し、それ以外の場合は 0 を返します。

于 2018-06-17T13:45:18.440 に答える