0

SQL ステートメントの Where 句に注目しており、Where 句で使用されているすべての列を取り戻そうとしています。以下は SQL の例です。

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"""

私が期待している列は、T.JOIN_DT、T.POSTING_DT、T.PERS_ID、および T.LEAVE_DT です。以下のコードは、T.PERS_ID 以外のすべてを引き出すことができます。

from __future__ import print_function
import re
import sqlparse 
import numpy as np
from sqlparse.sql import IdentifierList, Identifier, Function, Where, Parenthesis, TokenList, Comparison, Operation
from sqlparse.tokens import Keyword, DML, Punctuation

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]

where_columns = []
full_columns = []

for item in parsed.tokens:
    if isinstance(item, Where):

        
        for condition in item.tokens:
            
            if isinstance(condition, Identifier):
                where_columns.append(condition.get_parent_name())
                where_columns.append(condition.get_real_name())
                full_columns.append(where_columns)
                where_columns = []
        
                       
            if isinstance(condition, Comparison):
                for breakdown in condition.tokens:
                    if isinstance(breakdown, Identifier):
                        where_columns.append(breakdown.get_parent_name())
                        where_columns.append(breakdown.get_real_name())
                        full_columns.append(where_columns)
                        where_columns = []
                              

print(full_columns)

「AND P.PERS_ID LIKE '%123'」を 1 つのトークンにグループ化しているようですが、それをさらに分割して識別子 P.PERS_ID を取得する方法がわかりません。print(condition)後に追加すると、for condition in item.tokens:私が何を意味するかがわかります。

4

1 に答える 1

0

問題は、T.POSTING_DT の後に末尾の引用符があることです。

ただし、私のライブラリSQLGlotは、列を簡単に抽出できます。

import sqlglot
import sqlglot.expressions as exp

sql = """
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
"""

for column in sqlglot.parse_one(sql).find(exp.Where).find_all(exp.Column):
    print(column.text("this"))


CURRENT_DATE
CURRENT_DATE
LEAVE_DT
PERS_ID
POSTING_DT'
JOIN_DT
于 2021-11-17T05:17:49.460 に答える