SQL转Snowflake SQL:正则表达式转换及含义咨询
问题
需要将以下SQL代码转换为Snowflake SQL,不清楚如何转换其中的正则表达式[^''a-Z -],同时想确认该正则是否表示排除空格、字母和连字符。
原SQL代码:
----SQL CODE UPDATE t1 A SET A.col1 = 'NOT VALID' FROM t1 INNER JOIN t2 B ON A.ID=B.ID WHERE B.name LIKE '%[^''a-Z -]%';
我尝试的代码如下,但对正则部分没有把握:
UPDATE t1 A SET A.col1 = 'NOT VALID' FROM t2 B where A.ID=B.ID AND RLIKE (B.name, [^''a-Z -]);
解答
1. 原正则的含义说明
原SQL里的LIKE '%[^''a-Z -]%'是SQL Server的通配符模式(不是标准正则),实际含义是:匹配包含任何不在单引号、大小写字母(注意a-Z是错误范围,下文说明)、空格、连字符之外的字符的字符串。
''是SQL中转义单引号的写法,实际代表单个';a-Z是错误的字符范围:ASCII码里Z(90)比a(97)小,因此a-Z会包含[、\、]、^、_、`这些符号,而非仅大小写字母,这是原SQL的潜在bug。如果原意是匹配大小写字母,应写成a-zA-Z。
2. Snowflake SQL的转换修正
Snowflake使用标准正则表达式,需用RLIKE(或REGEXP_LIKE)函数,同时修正正则语法:
- 去掉SQL Server的
%通配符,RLIKE默认会检查字符串任意位置是否存在匹配项; - 修正字符范围为
a-zA-Z(如果业务逻辑是匹配大小写字母); - 正则字符串用单引号包裹,单引号转义为
''; - 否定集需将
^放在方括号开头,确保所有要排除的字符正确包含。
正确的Snowflake UPDATE语句
UPDATE t1 A SET A.col1 = 'NOT VALID' FROM t2 B WHERE A.ID = B.ID AND RLIKE(B.name, '[^a-zA-Z ''-]');
- 这里的
[^a-zA-Z ''-]表示:匹配任何不是大小写字母、空格、单引号、连字符的字符,只要B.name中存在这类字符,就会触发更新。 - 如果原SQL的
a-Z是故意设置(需包含中间符号),则保留a-Z,写成[^a-Z ''-],但建议先确认业务逻辑是否真的需要包含这些符号。
内容的提问来源于stack exchange,提问作者Akash Nair
相关产品推荐
相关产品推荐

