Amazon redshift amazon红移中SQL Server的isNumeric()等效项 我使用amazon redshift作为我的数据仓库 我有一个字符串类型的字段1。有些字符串以四个数字开头,有些字符串以字母开头:

Amazon redshift amazon红移中SQL Server的isNumeric()等效项 我使用amazon redshift作为我的数据仓库 我有一个字符串类型的字段1。有些字符串以四个数字开头,有些字符串以字母开头:,amazon-redshift,Amazon Redshift,“测试阿尔法” “1382测试版” 我想过滤掉字符串不是以四个数字开头的行 看看红移文档,我不相信isnumber或isnumeric是函数。似乎“like”函数是最好的可能性。 我试过了 其中leftfield1,4类似于“[0-9][0-9][0-9][0-9]” 这不起作用,从下面的链接来看,红移可能不支持: “where”子句中有错误吗?如果不是,并且红移中不支持该子句,是否有方法进行筛选?我在考虑使用cast cast(left(field1,4) as integer) 如果生成

“测试阿尔法” “1382测试版”

我想过滤掉字符串不是以四个数字开头的行 看看红移文档,我不相信isnumber或isnumeric是函数。似乎“like”函数是最好的可能性。 我试过了

其中leftfield1,4类似于“[0-9][0-9][0-9][0-9]”

这不起作用,从下面的链接来看,红移可能不支持:

“where”子句中有错误吗?如果不是,并且红移中不支持该子句,是否有方法进行筛选?我在考虑使用cast

cast(left(field1,4) as integer) 
如果生成错误,则传递该行,但不确定如何在amazon红移中执行此操作。或者isnumeric筛选器是否有其他代理

谢谢

试试以下方法:

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

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

红移似乎不支持以下任何一项:

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”函数在字符串字符为数字时将leftfield1,4解释为单个整数,而在非数字时不会给出错误。如果我发现问题,我会跟进。例如,我不处理小于1000的任何内容,所以我假设0001被解释为1,但不确定

看起来您要查找的代码与函数类似:

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

将删除以4位数字开头的行上述regexp_instr将为字段1以4位数字开头的行返回1

尽管自提出此问题以来已过了很长时间,但我没有找到足够的答案。因此,我觉得有义务分享我的解决方案,该解决方案在我的红移集群上运行良好,今天是2016年3月

自定义项功能是:

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

我们已经尝试了以下方法,并且在大多数情况下都有效:

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


这将包括正数、负数、整数和浮点数。

根据Amazon,posix风格~regex风格的表达式速度很慢。。。

使用自己的REGEXP_*函数似乎更快。

为了只检查整数的真/假,我成功地使用了下面的方法。 REGEXP_COUNTmy_字段_to_check'^[0-9]+$'>0


如果只有数字,则返回1;如果有其他内容,则返回0。红移应支持类似的操作

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

这表示字段1以0-9范围内的4个字符开头,然后是其他任何字符。

您的示例在PostgreSQL上不起作用。ILIKE不支持正则表达式。Amazon Redshift基于PostgreSQL 8.0.2,所以您可能可以使用相似的运算符REGEXP,因为相似是关键字,可能。。。有些类似于从1中为4选择子字符串“1234 xxx”,类似于“[\d]{4}”;谢谢伊戈尔和帕维尔。不幸的是,上面的代码似乎不适用于红移。以下声明:抱歉,评论被切断…谢谢伊戈尔和帕维尔。不幸的是,上面的代码似乎不适用于红移。当我在语句中添加“where field1~”^[0-9]{4}子句时,语句返回:“错误:不支持正则表达式匹配[SQL State=XX000]”。如果我尝试“where field1 like”^[0-9]{4},它将返回一个空表,但没有错误。如果我尝试“where field1 like”$,它将返回所有行。红移似乎只支持“like”,而不支持表达式的其余部分。有什么想法吗?再次感谢。如果你想仔细看看,这是关于“喜欢”的红移文档链接:目前是10月16日。这句话适用于红移查询。我认为这是不对的。以下面的示例为例:从一个where thing='3081_xl7'中选择count*,该thing介于0和999999之间;这将返回1。在本例中,这是一个varchar列。这一列对我来说很好,只是你必须使用撇号:其中leftfield,类似于“[0-9]{4}”的4应该是最上面的答案
WHERE field1 SIMILAR TO '[0-9]{4}%'