Python实现Snowflake SQL中仅替换IDENTIFIER包裹的会话变量
解决Snowflake SQL会话变量正则替换的括号误删问题
核心解决方案
使用精准的正则表达式匹配大小写不敏感的IDENTIFIER()函数包裹的会话变量,替换时直接将整个IDENTIFIER($VAR_NAME)结构替换为变量的实际值,避免误操作其他函数的括号结构,同时保留变量值中的完整函数格式(如MY_FUNC())。
正则表达式说明
(?i)\bIDENTIFIER\(\s*(\$[A-Z_]+)\s*\)
各部分作用:
(?i):开启全局大小写不敏感匹配,兼容identifier($var)、IDENTIFIER($Var)等写法\b:单词边界,避免匹配包含IDENTIFIER的复合字符串(如MYIDENTIFIER)IDENTIFIER\(:匹配IDENTIFIER函数的前缀和左括号\s*:匹配变量前后的任意空白字符(兼容IDENTIFIER( $TABLE_NAME )这类格式)(\$[A-Z_]+):捕获组,匹配$开头的会话变量名(支持大写字母和下划线,可根据实际规则调整为[A-Za-z0-9_])\s*\):匹配变量后的空白字符和IDENTIFIER函数的右括号
Python实现函数
import re def replace_snowflake_identifier_vars(sql_script: str, var_values: dict) -> str: # 编译正则表达式,提升匹配效率 pattern = re.compile(r'(?i)\bIDENTIFIER\(\s*(\$[A-Z_]+)\s*\)') def replace_callback(match: re.Match) -> str: var_name = match.group(1) # 存在变量值则替换,否则保留原IDENTIFIER结构 return var_values.get(var_name, match.group(0)) return pattern.sub(replace_callback, sql_script)
测试示例
输入SQL脚本
CREATE TABLE IDENTIFIER($TABLE_NAME) ( ID INT, DATE_COL DATE DEFAULT DATEADD(day, 1, CURRENT_DATE()), FUNC_COL VARCHAR DEFAULT IDENTIFIER($COL_FUNC) );
变量字典
var_map = { "$TABLE_NAME": "USER_DATA", "$COL_FUNC": "GET_DEFAULT_VALUE()" }
处理后输出
CREATE TABLE USER_DATA ( ID INT, DATE_COL DATE DEFAULT DATEADD(day, 1, CURRENT_DATE()), FUNC_COL VARCHAR DEFAULT GET_DEFAULT_VALUE() );
关键优势
- 仅匹配
IDENTIFIER()包裹的变量,完全不会影响DATEADD、CURRENT_DATE等其他函数的括号结构 - 保留变量值中的完整函数格式(如
GET_DEFAULT_VALUE()),无需额外处理括号 - 兼容大小写和空白字符的灵活写法,适配不同风格的SQL脚本
内容的提问来源于stack exchange,提问作者RuSXSnIpERXx
相关产品推荐
相关产品推荐

