web-dev-qa-db-ja.com

SQL Server isNumeric()はAmazonredshiftと同等です

  • データウェアハウスとしてAmazonredshiftを使用しています
  • 文字列型のフィールド(field1)があります。一部の文字列は4つの数字で始まり、その他の文字列は文字で始まります。

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

  • 文字列が4つの数字で始まらない行を除外したい
  • 赤方偏移のドキュメントを見ると、isnumberまたはisnumericが関数であるとは思いません。 'like'関数が最良の可能性であるように思われます。
  • 私は試した

    ここで、left(field1、4)like '[0-9] [0-9] [0-9] [0-9]'

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

https://forums.aws.Amazon.com/message.jspa?messageID=43985

'where'句にエラーがありますか?そうでない場合、その句がredshiftでサポートされていない場合、フィルタリングする方法はありますか?キャストを使うことを考えていました

cast(left(field1,4) as integer) 

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

ありがとう

15
Elm

Redshiftは次のいずれもサポートしていないようです。

where left(field1,4) like '[0-9][0-9][0-9][0-9]' 
where left(field1,4) ~ '^[0-9]{4}'
where left(field1,4) like '^[0-9]{4}'

動作しているように見えるものは次のとおりです。

where left(field1,4) between 0 and 9999

これにより、4つの数字で始まるすべての行が返されます。

field1は文字列型ですが、 'between'関数は、文字列文字が数値の場合はleft(field1,4)を単一の整数として解釈するようです(数値でない場合はエラーになりません)。問題が見つかった場合はフォローアップします。たとえば、1000未満のものは扱っていないので、0001は1として解釈されると思いますが、確かではありません。

3
Elm

次のようなものを試してください:

where field1 ~ '^[0-9]{4}'

4桁で始まる任意の文字列に一致します。

11

この質問をしてから長い時間が経ちましたが、適切な回答が見つかりませんでした。そのため、今日(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
9
Benedetto

探しているのはsimilar to関数のようです( Redshift doc

where left(field,4) similar to [0-9]{4}
4
Ruben

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

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

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

3
Matthew

私たちは以下を試し、ほとんどのシナリオで機能しました。

列〜 '^ [-] {0,1} [0-9] {1、} [。] {0,1} [0-9] {0、} $'

これは、正、負、整数、および浮動小数点数になります。

2
Bhupendra Patni
where regexp_instr(field1,'^[0-9]{4}') = 0

4桁で始まる行を削除します(上記のregexp_instrは、field1が4桁で始まる行に対して1を返します)

2
DogBoneBlues

redshiftはと同様にサポートする必要があります。

WHERE field1 SIMILAR TO '[0-9]{4}%'

これは、field1が0〜9の範囲の4文字で始まり、それ以外の文字で始まる場所として読み取られます。

0
gdove