首页 > 解决方案 > 正则表达式在 SQL 中获取值

问题描述

我正在尝试读取 SQL 的键值内的值,即 UPDATE、SET、FROM 和 WHERE。使用正则表达式,我可以在 where 子句之后的第一行之前获取值,但无法获得完整的 where 子句。请建议。

需要从中获取值的示例 SQL。

 UPDATE dbname.tablename  
    SET
    alias1=T1.col1,
    alias2=T1.col2
    FROM datafabric_cfd_dea.T1 T1 
    WHERE
    tablename.keycol =T1.keycol
    AND tablename.col3='ABC'
    AND T1.col3='ABC'
    AND tablename.col3=T1.col3
    AND T1.col2='XYZ';

正则表达式:

UPDATE\s*(.*)\s*SET\s*(.*)\s*FROM\s*(.*)\s*WHERE\s*(.*)

请建议。

标签: pythonregex

解决方案


我不认为正则表达式是最适合这项工作的工具。由于我们在 Python 生态系统中运行,我们很幸运能够在 PyPI 上使用大量第三方包的强大功能。有一个流行的包叫做sqlparse实现了一个 SQL 解析器

您可以解析您的 SQL 语句并分析解析的标记:

In [1]: import sqlparse

In [2]: sql = """ UPDATE dbname.tablename  
   ...:     SET
   ...:     alias1=T1.col1,
   ...:     alias2=T1.col2
   ...:     FROM datafabric_cfd_dea.T1 T1 
   ...:     WHERE
   ...:     tablename.keycol =T1.keycol
   ...:     AND tablename.col3='ABC'
   ...:     AND T1.col3='ABC'
   ...:     AND tablename.col3=T1.col3
   ...:     AND T1.col2='XYZ';"""

In [3]: parsed_sql = sqlparse.parse(sql)

# get the where clause
In [4]: where_clause = next(token for token in parsed_sql[0].tokens 
                            if isinstance(token, sqlparse.sql.Where))

In [5]: where_clause.tokens
Out[5]: 
[<Keyword 'WHERE' at 0x10FCD1A78>,
 <Newline ' ' at 0x10FCD1668>,
 <Whitespace ' ' at 0x10FCD1B48>,
 <Comparison 'tablen...' at 0x10FCCDB50>,
 <Newline ' ' at 0x10FCD1AE0>,
 ...
 <Comparison 'T1.col...' at 0x10FCCDD50>,
 <Punctuation ';' at 0x10FCF5EF0>]

推荐阅读