16
  • 我使用 amazon redshift 作为我的数据仓库
  • 我有一个字符串类型的字段(field1)。一些字符串以四个数字开头,而另一些则以字母开头:

'测试 alpha'
'1382 测试 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) 

如果它产生错误,然后传递该行,但不确定如何在亚马逊红移中执行此操作。或者是否有其他用于非数字过滤器的代理。

谢谢

4

8 回答 8

16

尝试类似:

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

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

于 2013-06-05T21:54:40.807 回答
12

尽管自从提出这个问题以来已经过去了很长时间,但我还没有找到足够的答案。所以我觉得有义务分享我的解决方案,该解决方案在我今天(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
于 2016-06-03T12:36:41.737 回答
6

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

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

红移文档

于 2015-06-12T21:49:36.460 回答
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}'

似乎有效的是:

where left(field1,4) between 0 and 9999

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

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

于 2013-06-06T06:33:03.337 回答
4

每个亚马逊,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

于 2018-06-17T13:45:18.440 回答
2
where regexp_instr(field1,'^[0-9]{4}') = 0

将删除以 4 位开头的行(上面的 regexp_instr 将为 field1 以 4 位开头的行返回 1)

于 2015-06-15T16:44:13.140 回答
2

我们已经尝试了以下方法并适用于我们的大多数场景:

列~'^[-]{0,1}[0-9]{1,}[.]{0,1}[0-9]{0,}$'

这将是正数、负数、整数和浮点数。

于 2017-05-04T21:28:02.910 回答
1

redshift should support similar to.

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

This reads as where field1 starts with 4 characters in the range of 0-9, then anything else.

于 2019-09-04T16:06:02.220 回答