REGEXP_LIKE Oracle 相当于计算 Snowflake 中的字符数
REGEXP_LIKE Oracle equivalent to count characters in Snowflake
我正在尝试在 Snowflake 中提出与以下 Oracle 语句等效的语句。这将检查字符串的不同部分是否由“.”分隔。匹配 REGEXP_LIKE 表达式中的字符数。我想出了一个基本版本来在 Snowflake 中执行检查,但我确信有更好、更清洁的方法来执行此操作。我希望在类似于 Oracle 的 Snowflake 中提出单行正则表达式检查。感谢您的帮助!
-- Oracle
SELECT -- would return True
CASE
WHEN REGEXP_LIKE('AB.XYX.12.34.5670.89', '^\w{2}\.\w{3}\.\w{2}') THEN 'True'
ELSE NULL
END AS abc
FROM DUAL
-- Snowflake
SELECT -- would return True
REGEXP_LIKE(SPLIT_PART('AB.XYX.12.34.5670.89', '.', 1), '[A-Z0-9]{2}') AND
REGEXP_LIKE(SPLIT_PART('AB.XYX.12.34.5670.89', '.', 2), '[A-Z0-9]{3}') AND
REGEXP_LIKE(SPLIT_PART('AB.XYX.12.34.5670.89', '.', 3), '[A-Z0-9]{2}') AS abc
您需要在末尾添加一个 .*
作为 REGEXP_LIKE adds explicit ^
&& $
到字符串:
The function implicitly anchors a pattern at both ends (i.e. '' automatically becomes '^$', and 'ABC' automatically becomes '^ABC$'). To match any string starting with ABC, the pattern would be 'ABC.*'.
select
column1 as str,
REGEXP_LIKE(str, '\w{2}\.\w{3}\.\w{2}.*') as oracle_way
FROM VALUES
('AB.XYX.12.34.5670.89')
;
给出:
STR
ORACLE_WAY
AB.XYX.12.34.5670.89
TRUE
或者在您问题的上下文中:
SELECT IFF(REGEXP_LIKE('AB.XYX.12.34.5670.89', '\w{2}\.\w{3}\.\w{2}.*'), 'True', null) AS abc;
您对 \w
的使用似乎表明您不需要分隔字符串严格地 [A-Z0-9]
因为单词字符允许下划线和句点。如果所有赌注都关闭并且唯一的要求是 .
在第 3、第 7 和第 10 个位置,您可以这样使用 like
。
select 'AB.XGH.12.34.5670.89' like '__.___.__.%' ;
我正在尝试在 Snowflake 中提出与以下 Oracle 语句等效的语句。这将检查字符串的不同部分是否由“.”分隔。匹配 REGEXP_LIKE 表达式中的字符数。我想出了一个基本版本来在 Snowflake 中执行检查,但我确信有更好、更清洁的方法来执行此操作。我希望在类似于 Oracle 的 Snowflake 中提出单行正则表达式检查。感谢您的帮助!
-- Oracle
SELECT -- would return True
CASE
WHEN REGEXP_LIKE('AB.XYX.12.34.5670.89', '^\w{2}\.\w{3}\.\w{2}') THEN 'True'
ELSE NULL
END AS abc
FROM DUAL
-- Snowflake
SELECT -- would return True
REGEXP_LIKE(SPLIT_PART('AB.XYX.12.34.5670.89', '.', 1), '[A-Z0-9]{2}') AND
REGEXP_LIKE(SPLIT_PART('AB.XYX.12.34.5670.89', '.', 2), '[A-Z0-9]{3}') AND
REGEXP_LIKE(SPLIT_PART('AB.XYX.12.34.5670.89', '.', 3), '[A-Z0-9]{2}') AS abc
您需要在末尾添加一个 .*
作为 REGEXP_LIKE adds explicit ^
&& $
到字符串:
The function implicitly anchors a pattern at both ends (i.e. '' automatically becomes '^$', and 'ABC' automatically becomes '^ABC$'). To match any string starting with ABC, the pattern would be 'ABC.*'.
select
column1 as str,
REGEXP_LIKE(str, '\w{2}\.\w{3}\.\w{2}.*') as oracle_way
FROM VALUES
('AB.XYX.12.34.5670.89')
;
给出:
STR | ORACLE_WAY |
---|---|
AB.XYX.12.34.5670.89 | TRUE |
或者在您问题的上下文中:
SELECT IFF(REGEXP_LIKE('AB.XYX.12.34.5670.89', '\w{2}\.\w{3}\.\w{2}.*'), 'True', null) AS abc;
您对 \w
的使用似乎表明您不需要分隔字符串严格地 [A-Z0-9]
因为单词字符允许下划线和句点。如果所有赌注都关闭并且唯一的要求是 .
在第 3、第 7 和第 10 个位置,您可以这样使用 like
。
select 'AB.XGH.12.34.5670.89' like '__.___.__.%' ;