sql多列轉多行
㈠ MS SQL SERVER 如何把多列的值 , 變成一列多行 .
MS SQL SERVER沒有這樣的函數可以將多列轉變為多行。
SELECT '小名' AS c1
union all
select '小名' AS c2
union all
select '小名' AS c3
union all
select '小名' AS c4
union all
select '小名' AS c5
union all
select '小名' AS c6
union all
select '小名' AS c8
㈡ Flink SQL 如何實現列轉行
在 SQL 任務裡面經常會遇到一列轉多行的需求,下面就來總結一下在戚凱 Flink SQL 裡面如何實現列轉行的,先來看下面的一個具體案例.
原始數據格式如下:
現在希望得到的數據格式是這樣的:
這是一個典型的列轉行或者一行轉多行的場景,需要將 data 列進行拆分成為多行多列,下面介紹兩種實現方式.
這里在定義 data 欄位類型的時候直接定義為 ARRAY 類型,因為 unnest 函數需要一個數組類型的參數.
自定義表值函數(UDTF),自定義表值函數,將 0 個、1 個或多個標量值作為輸入參數(可以是變長參數)。與自定義的標量函數類似,但與宴賣標量函數不同。表值函數可以返回任意數量的行作為輸出,而不僅是 1 個值。返回的行可以由 1 個或多個列組成。調用一次函數輸出多行或多列數據。必須繼承 TableFunction 基類,並實現一個或者多個名為 eval 的方法, 在使用 UDTF 時,需要帶上 LATERAL TABLE兩個關鍵字.
自定義高祥喚 UDTF 解析的時候,就不需要把 data 欄位定義成 ARRAY 類型了,直接定義成 STRING 類型就可以了,並且這種方式會更加的靈活,比如還需要過濾數據或者更復雜的一些操作時都可以在 UDTF 裡面完成.
unnest 和 自定義 UDTF 函數在使用的時候都有 3 種寫法,前面兩種寫法的效果其實是一樣的,第三種寫法相當於 left join 的用法.區別在於 CROSS JOIN/INNER JOIN: 對於左側表的每一行,右側 UDTF 不輸出,則這一行不輸出.LEFT JOIN: 對於左側表的每一行,右側 UDTF 不輸出,則這一行會輸出,右側 UDTF 欄位為 null
在實際使用的時候如果 unnest 可以滿足需求就直接用 unnest 不需要帶來額外的開發,如果 unnest 函數滿足不了需求,那麼就自定義 UDTF 去完成.