使用sqlparse解析SQL WHERE子句时LIKE通配符条件的列提取问题
问题根因
- 原SQL存在语法错误:
T.POSTING_DT后多了一个多余的单引号,会干扰sqlparse的语法解析,需先移除。 - 原代码仅遍历了Where节点下的第一层Token,通过
AND/OR关联的复合条件会被封装为Operation类型的父Token,其内部嵌套的Comparison不会被直接识别到,需要增加递归遍历逻辑处理复合Token。
修复后代码
from __future__ import print_function import sqlparse from sqlparse.sql import Identifier, Where, Comparison, Operation, TokenList sql_2 = """Select PERS_ID , STF_NO , NAME FROM TEST T WHERE T.JOIN_DT >= T.POSTING_DT AND T.PERS_ID LIKE '%123%' AND T.LEAVE_DT BETWEEN CURRENT_DATE - 20 AND CURRENT_DATE - 1""" parsed = sqlparse.parse(sql_2)[0] full_columns = [] # 递归提取Token中的标识符列 def extract_columns(token): # 匹配带表别名的列字段 if isinstance(token, Identifier): parent_name = token.get_parent_name() real_name = token.get_real_name() if parent_name and real_name: full_col = f"{parent_name}.{real_name}" if full_col not in full_columns: full_columns.append(full_col) # 复合类型Token递归遍历子节点 if isinstance(token, (Comparison, Operation, TokenList, Where)): for sub_token in token.tokens: extract_columns(sub_token) # 定位Where节点开始提取 for item in parsed.tokens: if isinstance(item, Where): extract_columns(item) print(full_columns)
运行结果
['T.JOIN_DT', 'T.POSTING_DT', 'T.PERS_ID', 'T.LEAVE_DT']
内容的提问来源于stack exchange,提问作者MrPaul91
相关产品推荐
相关产品推荐

