高版本下的druid獲取字段別名

數據平臺中關於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());
        }

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章