'测试alpha'
'1382 test beta'
我试过
其中left(field1,4)喜欢'[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过滤器。
感谢
答案 0 :(得分:10)
尝试类似:
where field1 ~ '^[0-9]{4}'
它将匹配任何以4位数字开头的字符串。
答案 1 :(得分:7)
虽然问这个问题已经过了很长时间但我还没有找到足够的答案。因此,我觉得有必要今天(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
答案 2 :(得分:3)
似乎红移不支持以下任何一项:
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
这将返回以四个数字字符开头的所有行。
似乎即使field1是字符串类型,当字符串字符是数字时,'between'函数将left(field1,4)解释为单个整数(并且当它们不是数字时不会给出错误)。如果我发现问题,我会跟进。例如,我不处理任何小于1000的东西,所以我假设,但不确定,0001被解释为1.
答案 3 :(得分:3)
看起来像你正在寻找的是similar to
函数(Redshift doc)
where left(field,4) similar to [0-9]{4}
答案 4 :(得分:2)
where regexp_instr(field1,'^[0-9]{4}') = 0
将删除以4位数字开头的行(上面的regexp_instr将返回1,其中field1以4位数开头)
答案 5 :(得分:2)
我们已经尝试了以下内容并且适用于大多数情况:
columnn~&#39; ^ [ - ] {0,1} [0-9] {1,} [。] {0,1} [0-9] {0,} $&#39; < / p>
这将是正数,负数,整数和浮点数。
答案 6 :(得分:2)
根据亚马逊,posix风格〜正则表达式的表达方式很慢......
-imacros
使用他们自己的-dD
函数似乎更快。
https://docs.aws.amazon.com/redshift/latest/dg/pattern-matching-conditions.html
为了检查整数的真/假,我一直在使用以下成功。
REGEXP_*
如果只有数字则返回1,如果有的话则返回0
答案 7 :(得分:1)
redshift应该支持类似的功能。
WHERE field1 SIMILAR TO '[0-9]{4}%'
这表示字段1以0到9范围内的4个字符开头,然后是其他任何内容。