替代雪花中的正则表达式
alternative to below regular expression in snowflake
我正在尝试在 snowflake 中使用 oracle 正则表达式代码,但在 snowflake 中按预期工作时得到空值。
要求:比较 post 代码和 return 结果是否符合格式。
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
这个表达式需要做哪些修改
REGEXP_LIKE 必须匹配整个字符串,而不仅仅是它的一部分,以便 return 为真。
您可能想要这样的东西(在 Snowflake 中 REGEXP 会自动锚定):
[A-Z]{2}[0-9]{1,3}[A-Z]{2}
这将匹配 2 个大写字母,后跟 1 到 3 个数字,再后跟 2 个大写字母的模式。您可以根据您正在编码的国家/地区的邮政编码进行适当调整。
正如 Greg 指出的那样,REGEX 函数会自动锚定,因此 ^
和 $
标记不是 "needed",但如果你想要一个开放的尾巴,那么你需要添加一个 .*
.
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 个字符,然后是一些数字,然后是任何东西。无论如何,应该可以看到如何以适合您的格式混合和匹配那些匹配的部分以匹配您拥有的数据。
另外,作为 REGEXP_LIKE
的解决方法,您可以使用 REGEXP_SUBTR(...) IS NOT NULL
这会起作用,因为 REGEXP_SUBSTR 不应用自动锚定。
我正在尝试在 snowflake 中使用 oracle 正则表达式代码,但在 snowflake 中按预期工作时得到空值。
要求:比较 post 代码和 return 结果是否符合格式。
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
这个表达式需要做哪些修改
REGEXP_LIKE 必须匹配整个字符串,而不仅仅是它的一部分,以便 return 为真。
您可能想要这样的东西(在 Snowflake 中 REGEXP 会自动锚定):
[A-Z]{2}[0-9]{1,3}[A-Z]{2}
这将匹配 2 个大写字母,后跟 1 到 3 个数字,再后跟 2 个大写字母的模式。您可以根据您正在编码的国家/地区的邮政编码进行适当调整。
正如 Greg 指出的那样,REGEX 函数会自动锚定,因此 ^
和 $
标记不是 "needed",但如果你想要一个开放的尾巴,那么你需要添加一个 .*
.
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 个字符,然后是一些数字,然后是任何东西。无论如何,应该可以看到如何以适合您的格式混合和匹配那些匹配的部分以匹配您拥有的数据。
另外,作为 REGEXP_LIKE
的解决方法,您可以使用 REGEXP_SUBTR(...) IS NOT NULL
这会起作用,因为 REGEXP_SUBSTR 不应用自动锚定。