ODPS 將列中逗號分隔的資料展示為多行資料

2021-10-23 15:18:43 字數 1359 閱讀 1551

odps 中有的列有資料是逗號分隔的資料,需要轉化為多行資料,方便與其他表關聯查詢。效果如下:

原表err_code

desc_cn

chans

st001

簽名匹配失敗

-1,-2,-3

結果表err_code

desc_cn

chan

st001

簽名匹配失敗

-1st001

簽名匹配失敗

-2st001

簽名匹配失敗

-3可以借助odps mapjoin和自增表實現該功能。

實現主要參考mysql的實現方式,

1、建立自增表

create table if not exists incre_table

( autoincreid bigint

) comment '自增表,主要用於拆分欄位為逗號分隔的列,例如dim_yp_sms_error_code'

lifecycle 36000;

2、自增表插入資料(這裡我插入了150條自增資料)

3、sql計算

insert overwrite table dim_yp_sms_error_code_format

select err_code, max(desc_cn) as desc_cn, chan from(

select distinct err_code, desc_cn, chan from(

select /* + mapjoin(b) */

a.err_code

,a.desc_cn

,substring_index(substring_index(a.chans,',',b.autoincreid),',',-1) as chan

from (

select err_code

,desc_cn

,case when chans is null then ''

else chans

end as chans

from dim_yp_sms_error_code

) ajoin incre_table b

on b.autoincreid <= (length(a.chans) - length(replace(a.chans,',','')) + 1)

) t) t2

group by err_code, chan

;

SQL Like中的逗號分隔符

在與資料庫互動的過程中,我們經常需要把一串id組成的字串當作引數傳給儲存過程獲取資料。很多時候我們希望把這個字串轉成集合以方便用於in操作。有兩種方式可以方便地把這個以某種符號分隔的id字串轉成臨時表。方式一 通過charindex和substring。create function func sp...

將逗號分隔的字串(陣列)取出存到陣列中

include include include include using namespace std 將包含有逗號的字串分隔出來 將所有的逗號或者其他標點符號替換成空格,然後利用istringstream將字串或者數值存下來。int main istringstream m str m接收字串,名...

獲取為以逗號分隔列值的字串

有否想過,獲取為以逗號分隔列值的字串。下面的語句顯示乙個簡單的例子,你可以作為乙個起點。select stuff select title from employees forxml path 1,2,全文完 以下為廣告部分 如果您想看下您的 https部署的是否安全,花1分鐘時間來 myssl.c...