我正在尝试在雪花中使用oracle正则表达式代码,但是在雪花中按预期方式运行时会得到null值。
要求:比较邮政编码,如果匹配格式则返回结果。
SELECT
CASE WHEN REGEXP_LIKE('AB101TZ','^[A-Z]{2}[0-9]+') THEN 'AB101TZ'
WHEN REGEXP_LIKE('AB101TZ','^[A-Z][0-9]+') THEN 'AB101TZ'
ELSE '-'
END postcode_part_a
该表达式需要进行哪些修改
答案 0 :(得分:0)
REGEXP_LIKE必须匹配整个字符串,而不仅仅是部分字符串,以返回true。
您可能想要这样的东西(在Snowflake中REGEXP自动定位):
[A-Z]{2}[0-9]{1,3}[A-Z]{2}
这将匹配模式2个大写字母,后跟1到3个数字,然后是2个大写字母。您可以根据要编码的国家/地区的邮政编码进行适当调整。
答案 1 :(得分:0)
因此,正如Greg指出的那样,REGEX函数会自动定位,因此^
和$
标记不是“必需的”,但是如果您想要一个开放的尾巴,则需要添加一个{ {1}}。
.*
这给出了:
SELECT column1
,REGEXP_LIKE(column1,'[A-Z]{2}[0-9]+') as A
,REGEXP_LIKE(column1,'[A-Z][0-9]+') as B
,REGEXP_LIKE(column1,'[A-Z]{2}[0-9]{1,3}[A-Z]{2}') as C
,REGEXP_LIKE(column1,'[A-Z]{1,2}[0-9]+.*') as D
FROM VALUES ('AB101TZ'), ('_AB101TZ'), ('AA0000'), ('A00000');
因此A和B是您要进行匹配的对象,但是删除了“ $”以显示它们确实匹配的对象。因此,为什么您输入的内容不匹配,因为COLUMN1 A B C D
AB101TZ FALSE FALSE TRUE TRUE
_AB101TZ FALSE FALSE FALSE FALSE
AA0000 TRUE FALSE FALSE TRUE
A00000 FALSE TRUE FALSE TRUE
不是数字
C是Greg的解决方案。这将与您的第二个过滤器TZ
不匹配,因此我使D允许1个或2个字符,然后是一些数字,然后是任何其他字符。无论如何,应该能够以适合您的格式查看如何混合和匹配那些匹配的部分以匹配您的数据。