數據平臺中關於sql處理和數據庫連接的動作較多,有時候需要具體處理sql字段。
com.alibaba.druid 在版本1.1.3版本之後去掉了getAliasMap()方法,所以如果高版本想要搞出複雜sql中的字段別名,需要額外進行自己實現。巨坑的是,大神們都不搞這個東西了。。。
低版本:小於1.1.3:
public static void main(String[]args){
String sql = "select current_date as \"date\",tag.name as \"TAG名稱\",count(1) as \"關注用戶數\" from\n" +
"(select target_id,user_id from dw.dw_follow_d where day = cast(date_add('day',-1,current_date) as varchar) and create_time >= :startTime and create_time <= :endTime and type = 'TAG') t\n" +
"join( select user_id,gender from dw.dw_user_info_d where day = cast(date_add('day',-1,current_date) as varchar) and gender in ( :sex ) ) u\n" +
"on u.user_id = t.user_id\n" +
"join ods.ods_tag_all tag on tag.id = t.target_id\n" +
"group by tag.name\n" +
"order by \"關注用戶數\" desc limit 100";
MySqlStatementParser parser = new MySqlStatementParser(sql);
SQLStatement stmt = parser.parseStatement();
MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor();
stmt.accept(visitor);
Map<String, String> map = visitor.getAliasMap();
System.out.println(map);
Set<String> set = map.keySet();
}
當前得到的set就是字段別名,
如果大於1.1.3版本,自行實現獲得別名方法:如下
public static void main(String[] args){
String sql ="select a.day as date,a.userid as 用戶id, case when gender = 0 then 男 when gender = 1 then 女 else 未知 end as 性別,a.content as 內容,success_cnt as 語音匹配成功數,fail_cnt as 語音匹配失敗數\n" +
"from\n" +
"(select userid,day,content from ods.ods_feedback_label_d where day >= :startTime and day <= :endTime) a\n" +
"join\n" +
"(select user_id,gender from user where day = CAST(date_add(day, -1, current_date) AS varchar) and state = 0)b\n" +
"on a.userid = b.user_id\n" +
"left join\n" +
"(\n" +
"select c.day,c.userid,sum(case when resultType = 1 then 1 else 0 end) as success_cnt,\n" +
"sum(case when resultType = 2 then 1 else 0 end) as fail_cnt\n" +
"from\n" +
"(select distinct userid,day from ods.ods_feedback_label_d where day >= :startTime and day <= :endTime) c\n" +
"left join\n" +
"(select day,uid,resultType from ods.ods_match_log_d where day >= :startTime and day <= :endTime and matchType = ONLINE_CALL)d\n" +
"on c.userid = cast(d.uid as integer) and c.day = d.day\n" +
"group by c.day,c.userid\n" +
")e\n" +
"on a.userid = e.userid and a.day = e.day\n" +
"order by a.day desc";
String dbType = JdbcConstants.MYSQL;
sql = sql.replaceAll("\'","");
sql = sql.replaceAll("\"","");
log.info("sql"+sql);
List<SQLStatement> stmtList = SQLUtils.parseStatements(sql, dbType);
SQLStatement stmt = stmtList.get(0);
Set<String> set = new HashSet<>();
List<SQLSelectItem> list = ((MySqlSelectQueryBlock)((SQLSelect)((SQLSelectStatement)stmt).getSelect()).getQuery()).getSelectList();
for(SQLSelectItem item : list){
String clomn = item.getAlias();
set.add(item.getAlias());
}