postgresql 行转列

文章参考路径:https://www.jianshu.com/p/31c586446512

开发过程中主要引用了“自建函数(动态)”这个函数,但是我对这个函数做了一点修改,因为我的列是多个列

我要把supplycode,status,expirydateend,expirydatestart,credentialtype这四列合并到一起之后在进行行转列。利用row_to_json将这四列转为为jsonb格式,然后利用左连接和supplycode,text关联起来

 on aa.supplycode=(cc.linceseresult->>'supplycode')::VARCHAR and aa.value=(cc.linceseresult->>'credentialtype')::VARCHAR

得到这样的结果,然后再根据select supplycode,'tab'||value as text,COALESCE(linceseresult,'{"status":"3"}')插入到一个实体表中。

接下来调用动态函数,动态函数的改动是:将string_agg((case '||cat||' when '''||arow.col||''' then '||value_field||' else '''' end),'''') '||cat||'_'||arow.col;

改为 ,to_json(string_agg((case '||cat||' when '''||arow.col||''' then '||value_field||' else '''' end),'''')::jsonb) '||arow.col;

这样我获取的列就是jsonb属性的字段了。直接用json不行,其中string_agg是用来合并空项,jsonb是去掉双引号,

最终结果就是这样,如果没有::jsonb

就会出现这样,如果不用string_agg进行合并,而改用jsonb_agg则会出现

这次主要建了一个实体表,本来想建临时表,但是postgresql的临时表存货周期过短。

string_agg主要是讲冗余的可以拼接起来,如果是空字符串则拼成空字符窜,如果是多余的则会拼成一个,当然以后还需要根据具体的业务使用哪种拼接方式。

猜你喜欢

转载自www.cnblogs.com/caidie/p/10564951.html