sql >> データベース >  >> RDS >> Oracle

SQL /HQLJavaからのテーブル名と列名の解析

    JSqlParser(https://github.com/JSQLParser/JSqlParser)を使用してこれを実現する方法は複数あります:

    1. TableNamesFinderをポンと鳴らすことができます すべての列もトラバースします。結果リストでわかるように、 TableNamesFinder のすべての出現をトラバースするわけではありません 、それは必要ないからです。したがって、ここでもトラバーサルの実装を完了する必要がありますが、私は完了しませんでした。

    2. JSqlParserAST-ノード機能を使用できます すべての列を取得します。特定のプロダクションの場合、JSqlParserは解析ツリーのノードを生成します。 それらの1つです。

    実装を完了するには、すべての列を収集し、このリストを区別する必要があります(ケース、テーブルなど)

    String sql = "SELECT * FROM  ( ( SELECT TBL.ID AS rRowId, TBL.NAME AS name, TBL.DESCRIPTION as description, TBL.TYPE AS type, TBL1.SHORT_NAME AS shortName  FROM ROLE_TBL TBL WHERE ( TBL.TYPE = 'CORE' OR  TBL1.SHORT_NAME = 'TNG' AND  TBL.IS_DELETED <> 1  ) ) MINUS ( SELECT TBL.ID AS rRowId, TBL.NAME AS name, TBL.DESCRIPTION as description, TBL.TYPE AS type, TBL3.SHORT_NAME AS shortName,TBL3.NAME AS tenantName FROM ROLE_TBL TBL INNER JOIN TYPE_ROLE_TBL TBL1 ON TBL.ID=TBL1.ROLE_FK LEFT OUTER JOIN TNT_TBL TBL3 ON TBL3.ID = TBL.TENANT_FK LEFT OUTER JOIN USER_TBL TBL4 ON TBL4.ID = TBL1.USER_FK WHERE ( TBL4.ID =771100 AND  TBL.IS_DELETED <> 1  ) ) ) ORDER BY name ASC";
    
        System.out.println("using TableNamesFinder to get column names");
        Statement statement = CCJSqlParserUtil.parse(sql);
        Select selectStatement = (Select) statement;
        TablesNamesFinder tablesNamesFinder = new TablesNamesFinder() {
            @Override
            public void visit(Column tableColumn) {
                System.out.println(tableColumn);
            }
        };
        tablesNamesFinder.getTableList(selectStatement);
    
        System.out.println("-------------------------------------------");
        System.out.println("using ast nodes to get column names");
        SimpleNode node = (SimpleNode) CCJSqlParserUtil.parseAST(sql);
    
        node.jjtAccept(new CCJSqlParserDefaultVisitor() {
            @Override
            public Object visit(SimpleNode node, Object data) {
                if (node.getId() == CCJSqlParserTreeConstants.JJTCOLUMN) {
                    System.out.println(node.jjtGetValue());
                    return super.visit(node, data);
                } else {
                    return super.visit(node, data);
                }
            }
        }, null);
    

    JSqlParserは単なるパーサーであることに注意する必要があります。したがって、(table.column)のように指定せずに列テーブル名を取得することはできません。これを正しく行うには、データベーススキーマが使用可能である必要があります。これは、以下を見ると明らかになります:

    select a from table1, table2
    

    これは有効なSQLです。




    1. トップ7データベース

    2. Postgresジオメトリ形式をWKTに変換します

    3. 生産性を向上させるためにホームオフィスを整理する

    4. MySQLで文字列から時間を取得する方法