【问题标题】:alternative to below regular expression in snowflake替代雪花中的正则表达式
【发布时间】:2020-09-04 12:06:00
【问题描述】:

我正在尝试在雪花中使用 oracle 正则表达式代码,但在雪花中按预期工作时得到空值作为结果。

要求:比较邮政编码,如果符合格式则返回结果。

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

这个表达式需要做哪些修改

【问题讨论】:

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


    【解决方案1】:

    REGEXP_LIKE 必须匹配整个字符串,而不仅仅是它的一部分,才能返回 true。

    您可能想要这样的东西(在 Snowflake REGEXP 中自动锚定):

    [A-Z]{2}[0-9]{1,3}[A-Z]{2}
    

    这将匹配模式 2 个大写字母,后跟 1 到 3 个数字,然后是 2 个大写字母。您可以根据您正在编码的国家/地区的邮政编码进行适当调整。

    【讨论】:

      【解决方案2】:

      正如 Greg 所指出的,REGEX 函数会自动锚定,因此 ^$ 标记不是“需要的”,但如果你想要一个开放的尾巴,那么你需要添加一个 .*

      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');
      

      因此这给出了:

      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
      

      所以 A 和 B 是您的匹配项,但删除了“$”以显示它们匹配的内容。因此,为什么您的输入不匹配,因为TZ 不是数字

      C 是 Greg 的解决方案。这不会与您的第二个过滤器^[A-Z][0-9]+' 匹配,因此我制作了 D 允许 1 或 2 个字符,然后是一些数字,然后是任何东西。无论如何,应该可以看到如何以适合您的格式混合和匹配这些匹配部分以匹配您拥有的数据。

      【讨论】:

        【解决方案3】:

        同样作为REGEXP_LIKE 的解决方法,您可以使用REGEXP_SUBTR(...) IS NOT NULL,因为 REGEXP_SUBSTR 不应用自动锚定。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-01-07
          • 2010-10-05
          • 1970-01-01
          • 2011-10-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多