PostgreSQLで「1時間以内に解けなければプログラマ失格となってしまう5つの問題」の5問目を解いてみた

久しぶりにこういうのやってみました。良い問題。

1時間以内に解けなければプログラマ失格となってしまう5つの問題が話題に

create or replace function eval(expr text, out ret integer) as
$$begin execute 'select ' || expr into ret; end;$$ language plpgsql;

with
    op (c) as (
       select unnest(ARRAY[ ' + ', ' - ', '' ])
    ),
    a (c) as (
        select 1 || op1.c
            || 2 || op2.c
            || 3 || op3.c
            || 4 || op4.c
            || 5 || op5.c
            || 6 || op6.c
            || 7 || op7.c
            || 8 || op8.c
            || 9
          from op as op1
             , op as op2
             , op as op3
             , op as op4
             , op as op5
             , op as op6
             , op as op7
             , op as op8
    )
select c
  from a
 where eval(c) = 100 
 order by 1
;