views:

502

answers:

2

I'm trying to search the DB2 equivalent of generate_series() (the PostgreSQL-way of generating rows). I obviously don't want to hard-code the rows with a VALUES statement.

select * from generate_series(2,4);

    generate_series
    -----------------
                    2
                    3
                    4
    (3 rows)
+2  A: 

I managed to write a recursive query that fits :

with dummy(id) as (
    select 2 from SYSIBM.SYSDUMMY1    
    union all
    select id + 1 from dummy where id + 1 between 2 and 4
)
select id from dummy

The query can be adapted to whatever for(;;) you can dream of.

Steve Schnepp
Result is ok, but it generates a warning on db2 v9SQL0347W The recursive common table expression "LOGINNAME.DUMMY" may contain an infinite loop. SQLSTATE=01605
Boune
Yes, I also have it in DB2v8. I don't know how to remove it though.
Steve Schnepp
+1  A: 

The where clause needs to be a bit more explicit about the bounds of the recursion in order for DB2 to suppress the warning. Here's a slightly adjusted version that does not trigger the warning:

with dummy(id) as (
    select 2 from SYSIBM.SYSDUMMY1    
    union all
    select id + 1 from dummy where id < 4
)
select id from dummy
I changed my accepted answer since it's better than mine :)
Steve Schnepp