Это решение построено на Vertica, но оно работает для каждой базы данных, которая предлагает функцию, соответствующую SPLIT_PART().
Часть из них соответствует технике ун-поворотной, который работает с каждым ANSI совместимой платформы базы данных, я объясняю здесь (только не-поворотную часть сценария):
Pivot sql convert rows to columns
Так что я бы сделайте это как здесь ниже. Я предполагаю, что минималистичное представление даты является частью второго столбца таблицы с двумя столбцами. Поэтому я сначала раскалываю эту короткую дату буквально в первом выражении Common Table (и в комментарии, я перечисляю вывод 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 здравомыслящий
При использовании оракула можно разделить строку, используя метод, описанный https://blogs.oracle.com/aramamoo/entry/how_to_split_comma_separated_string_and_pass_to_in_clause_of_select_statement ... должно быть в состоянии сделать в одном заявлении sql ... удача – Ruskin
С помощью Postgres вы можете использовать 'unnest (string_to_array())' –
PS исправить вашу структуру данных, нормализовать свои таблицы, быть счастливыми после этого. – GurV