簡體   English   中英

如何在SQL中拆分單元格並創建新行

[英]How to split a cell and create a new row in sql

我有一列存儲多個逗號分隔的值。 我需要以某種方式對其進行拆分,以便將其拆分為與該列中的值一樣多的行以及該行中的其余值。

例如:

John 111 2Jan
Sam  222,333 3Jan
Jame 444,555,666 2Jan
Jen  777 4Jan

輸出:

John 111 2Jan
Sam  222 3Jan
Sam  333 3Jan
Jame 444 2Jan
Jame 555 2Jan
Jame 666 2Jan
Jen  777 4Jan

PS:我已經看到多個與此類似的問題,但是找不到以這種方式拆分的方法。

該解決方案基於Vertica構建,但是適用於每個數據庫,該數據庫提供與SPLIT_PART()相對應的功能。

它的一部分對應於我在這里說明的每個符合ANSI的數據庫平台都可以使用的非透視技術(只是腳本的非透視部分):

Pivot SQL將行轉換為列

因此,我將在下面進行操作。 我假設簡約的日期表示形式是兩列輸入表的第二列的一部分。 因此,在將逗號分隔的列表拆分為標記之前,我首先要在第一個Common Table Expression(以及在注釋中,我列出該CTE的輸出)中拆分該短日期文字。

開始:

WITH
-- input
input(name,the_string) AS (
          SELECT 'John', '111 2Jan'
UNION ALL SELECT 'Sam' , '222,333 3Jan'
UNION ALL SELECT 'Jame', '444,555,666 2Jan'
UNION ALL SELECT 'Jen' , '777 4Jan'
)
,
-- put the strange date literal into a separate column
the_list_and_the_date(name,list,datestub) AS (
SELECT
  name
, SPLIT_PART(the_string,' ',1)
, SPLIT_PART(the_string,' ',2)
FROM input
)
-- debug
-- SELECT * FROM the_list_and_the_date;
-- name|list       |datestub
-- John|111        |2Jan
-- Sam |222,333    |3Jan
-- Jame|444,555,666|2Jan
-- Jen |777        |4Jan
,
-- ten integers (too many for this example) to use as pivoting value and as "index"
ten_ints(idx) AS (
          SELECT  1 
UNION ALL SELECT  2 
UNION ALL SELECT  3 
UNION ALL SELECT  4 
UNION ALL SELECT  5 
UNION ALL SELECT  6 
UNION ALL SELECT  7 
UNION ALL SELECT  8 
UNION ALL SELECT  9 
UNION ALL SELECT 10
)
-- the final query - pivoting prepared input using a CROSS JOIN with ten_ints
-- and filter out where the SPLIT_PART() expression evaluates to the empty string
SELECT
  name
, SPLIT_PART(list,',',idx) AS token
, datestub
FROM the_list_and_the_date
CROSS JOIN ten_ints
WHERE SPLIT_PART(list,',',idx) <> ''
;

name|token|datestub
John|111  |2Jan
Jame|444  |2Jan
Jame|555  |2Jan
Jame|666  |2Jan
Sam |222  |3Jan
Sam |333  |3Jan
Jen |777  |4Jan

玩的開心...

Marco the Sane

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM