SQL Server isNumeric()在amazon redshift中等效

时间:2013-06-05 19:34:25

标签: amazon-redshift

  • 我正在使用亚马逊红移作为我的数据仓库
  • 我有一个string类型的字段(field1)。一些字符串以四个数字开头,其他字符串以字母开头:

'测试alpha'
'1382 test beta'

  • 我想过滤掉字符串不以四个数字开头的行
  • 查看redshift文档,我不相信isnumber或isnumeric是函数。似乎'喜欢'功能是最好的可能性。
  • 我试过

    其中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过滤器。

感谢

8 个答案:

答案 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个字符开头,然后是其他任何内容。