工作中遇到了这么一个情况:sql查询结果,查出来需要遍历才能取到想要的结果
SELECT LAYER_CODE,GROUP_NAME FROM BS_CHNGROUP_DICT
START WITH GROUP_ID = '10809'
CONNECT BY GROUP_ID = PRIOR PARENT_ID
结果
我想要的是结果中,直接用get("C02")直接取得海南省,而不是去遍历list取得,虽然遍历也可以,但本着java代码简单点的初心,相对他动手,预期的sql查询结果想要这样的
这个效果,看样子牵扯到了查询结果行转列。百度开始找,
很多博客说使用聚合函数pivot,我尝试了一下,脑子不好使,我不是为了聚合计算结果,只是单纯的想两级反转而已,于是开始思考奇淫巧技。记录下这个过程。
SELECT
DECODE(LAYER_CODE,'C02',GROUP_NAME,NULL)C02,
DECODE(LAYER_CODE,'C03',GROUP_NAME,NULL)C03,
DECODE(LAYER_CODE,'C04',GROUP_NAME,NULL)C04
FROM
(
SELECT LAYER_CODE,GROUP_NAME FROM BS_CHNGROUP_DICT
START WITH GROUP_ID = '10809'
CONNECT BY GROUP_ID = PRIOR PARENT_ID
)
以上将结果清晰独立出来:
到这一步,都是用非常简单的sql拼凑的,列名主动给的,结果填充,到此,后面只需要将多行结果合并一行即可如下:
SELECT
WM_CONCAT(C02) C02,
WM_CONCAT(C03) C03,
WM_CONCAT(C04) C04
FROM
(
SELECT
DECODE(LAYER_CODE,'C02',GROUP_NAME,NULL)C02,
DECODE(LAYER_CODE,'C03',GROUP_NAME,NULL)C03,
DECODE(LAYER_CODE,'C04',GROUP_NAME,NULL)C04
FROM
(
SELECT LAYER_CODE,GROUP_NAME FROM BS_CHNGROUP_DICT
START WITH GROUP_ID = '10809'
CONNECT BY GROUP_ID = PRIOR PARENT_ID
)
)
使用oracle的wm_concat()函数,将多行合并
结果可得;
以上。