Có nhiều cách để đạt được điều này bằng cách sử dụng JSqlParser (https://github.com/JSQLParser/JSqlParser):
-
Bạn có thể tạo ra TableNamesFinder để đi qua tất cả các cột. Như bạn có thể thấy tại danh sách kết quả, TableNamesFinder không đi qua tất cả các lần xuất hiện của Cột , bởi vì nó không cần thiết cho nó. Vì vậy, người ta cũng phải hoàn thành việc triển khai truyền tải ở đây, điều mà tôi đã không làm.
-
Bạn có thể sử dụng JSqlParser AST - Tính năng nút để lấy tất cả các Cột. Đối với các sản phẩm cụ thể, JSqlParser tạo ra các nút cho một cây phân tích cú pháp. Cột là một trong số họ.
Để hoàn thành việc triển khai, người ta phải thu thập tất cả các cột và làm cho danh sách này trở nên khác biệt (trường hợp, bảng, v.v.)
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);
Người ta phải lưu ý rằng JSqlParser chỉ là một trình phân tích cú pháp. Do đó, không thể lấy tên bảng các cột mà không có nó được chỉ định như trong (table.column). Để làm được điều này, lược đồ cơ sở dữ liệu phải có sẵn. Điều này trở nên rõ ràng nếu bạn nhìn vào:
select a from table1, table2
là một SQL hợp lệ.