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 '__.___.__.%' ;