Oracle Setup:
CREATE TABLE table_name (col1, col2 ) AS
SELECT 'ABC', 5 FROM DUAL UNION ALL
SELECT 'DEF', 6 FROM DUAL UNION ALL
SELECT 'GHI', 0 FROM DUAL;
Query - Using a Collection:
SELECT t.Col1
FROM table_name t,
TABLE(
CAST(
MULTISET(
SELECT 1
FROM DUAL
WHERE t.Col2 > 0
CONNECT BY LEVEL <= t.Col2
)
AS SYS.ODCINUMBERLIST
)
);
Query - Using a recursive sub-query factoring clause:
WITH sqfc ( COL1, COL2 ) AS (
SELECT col1, col2 FROM table_name
UNION ALL
SELECT col1, col2 - 1 FROM sqfc WHERE col2 > 1
)
SELECT col1
FROM sqfc
WHERE col2 > 0 -- Needed if col2 is zero
ORDER BY Col1;
Output (from both queries):
COL1
----
ABC
ABC
ABC
ABC
ABC
DEF
DEF
DEF
DEF
DEF
DEF
SELECT col1, ABC, ABC, ABC, ABC, ABC, def, def, def, def, def?plsqlbecause you want the query to work with more than just Postgresql/Oracle?numstable, but even that varies across systems.)