天天看點

ORACLE 實作行轉列(字元串求和)

       使用關系型資料的實際項目中,難以避免變更增加字段,有時為了友善,不想加字段,把多個值存儲一個字段中,用逗号或其他分隔符進行分隔;存儲解決了,但是展示有時就比較麻煩了,比如存儲的是編碼,現在要依次解析成名稱。

      oracle提供非常簡單的方式來解決。

       1、使用wm_concat(field_name)

        在oracle中有一個wmsys使用者,這個使用者和sys,system等使用者一樣,是oracle安裝的時候就建立的,主要負責oracle日常工作的管理(WM:work manager),wm開頭的函數是這個使用者下的函數。

        舉例:select wm_concat(name) as name from user;

       2、使用 listagg 函數,但如果是oracle11g,使用listagg效率更高,更強大,官方也更推薦這種寫法。

       舉例:select listagg(name, ',') within group( order by name) as name from user;

      實際情況舉例:現在資料庫中存儲了編碼,是用逗号分隔的,前台需要顯示名稱,也用逗号分隔;

      SELECT wm_concat(ITEM_NAME) FROM SYS_DICT_ITEM

                                                                     WHERE GROUP_ID = '0001'

                                                                     AND INSTR('FUNCTION,ACTION,FOLDER',ITEM_CODE) > 0;

     運作結果:檔案夾菜單,功能菜單,動作

     結論:能在資料庫層解決問題,就不要在代碼層解決,能一條語句解決,就盡量不要使用過程或函數解決。不斷發掘oracle資料庫的強大之處,參考閱讀《oracel程式設計藝術》。