Regex для получения значений в SQL - PullRequest
0 голосов
/ 04 декабря 2018

Я пытаюсь прочитать значения внутри ключевых значений 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*(.*)

Пожалуйста, предложите.

1 Ответ

0 голосов
/ 04 декабря 2018

Я не думаю, что регулярные выражения являются наиболее подходящим инструментом для работы.Поскольку мы работаем в экосистеме 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>]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...