SQL Server在amazon redshift中的isNumeric()等效

Elm*_*Elm 14 amazon-redshift

  • 我正在使用amazon redshift作为我的数据仓库
  • 我有一个字符串类型的字段(field1).一些字符串以四个数字开头,其他字符串以字母开头:

'test
alpha''1382测试版'

  • 我想过滤掉字符串不以四个数字开头的行
  • 看看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) 
Run Code Online (Sandbox Code Playgroud)

如果它产生错误,然后通过该行,但不知道如何在亚马逊红移中执行此操作.或者是否存在isnumeric过滤器的其他代理.

谢谢

Igo*_*nko 12

尝试类似的东西:

where field1 ~ '^[0-9]{4}'
Run Code Online (Sandbox Code Playgroud)

它将匹配以4位数字开头的任何字符串.


Ben*_*tto 9

虽然问这个问题已经过了很长时间但我还没有找到足够的答案.因此,我觉得有必要分享我的解决方案,该解决方案今天(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;
Run Code Online (Sandbox Code Playgroud)

用法是:

select isnumeric(mycolumn), * from mytable
    where isnumeric(mycolumn)=false
Run Code Online (Sandbox Code Playgroud)


小智 6

看起来您正在寻找的代码是similar to函数:

where left(field,4) similar to '[0-9]{4}'
Run Code Online (Sandbox Code Playgroud)

红移文档


Elm*_*Elm 4

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}'
Run Code Online (Sandbox Code Playgroud)

似乎有效的是:

where left(field1,4) between 0 and 9999
Run Code Online (Sandbox Code Playgroud)

这将返回以四个数字字符开头的所有行。

看来,即使 field1 是字符串类型,当字符串字符是数字时, ' Between ' 函数也会将 left(field1,4) 解释为单个整数(并且当它们不是数字时不会给出错误)。如果发现问题我会跟进。例如,我不处理小于 1000 的任何值,因此我假设但不确定 0001 会被解释为 1。