雪花下方正则表达式的替代方案

时间:2020-05-18 16:02:16

标签: snowflake-cloud-data-platform regexp-like

我正在尝试在雪花中使用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

该表达式需要进行哪些修改

2 个答案:

答案 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个字符,然后是一些数字,然后是任何其他字符。无论如何,应该能够以适合您的格式查看如何混合和匹配那些匹配的部分以匹配您的数据。