You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 22:15:00