「テストアルファ」
「1382テストベータ」
私は試した
ここで、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フィルター用の他のプロキシがありますか。
ありがとう
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として解釈されると思いますが、確かではありません。
次のようなものを試してください:
where field1 ~ '^[0-9]{4}'
4桁で始まる任意の文字列に一致します。
この質問をしてから長い時間が経ちましたが、適切な回答が見つかりませんでした。そのため、今日(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
探しているのはsimilar to
関数のようです( Redshift doc )
where left(field,4) similar to [0-9]{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
整数の真/偽をチェックするために、私は以下を使用して成功しました。 REGEXP_COUNT(my_field_to_check, '^[0-9]+$') > 0
これは、数値のみの場合は1を返し、それ以外の場合は0を返します
私たちは以下を試し、ほとんどのシナリオで機能しました。
列〜 '^ [-] {0,1} [0-9] {1、} [。] {0,1} [0-9] {0、} $'
これは、正、負、整数、および浮動小数点数になります。
where regexp_instr(field1,'^[0-9]{4}') = 0
4桁で始まる行を削除します(上記のregexp_instrは、field1が4桁で始まる行に対して1を返します)
redshiftはと同様にサポートする必要があります。
WHERE field1 SIMILAR TO '[0-9]{4}%'
これは、field1が0〜9の範囲の4文字で始まり、それ以外の文字で始まる場所として読み取られます。