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...