0

次のPython式をpostgesqlに変換する方法は?

>>> ','.join([30 for x in range(3)])
30,30,30

私は列のあるテーブルを持っています:

id | entry | type | size
1 10 0 10 
2 20 0 10 
3 30 1 10
4 30 2 15

このようにクエリしたい:

SELECT id,
       CASE WHEN type = 1
          THEN 
              --For entry 30 and size 10 (300) - get 150,90,60
          WHEN type = 2
          THEN
              --For entry 10 and size 15 (150) - get 30,30,30,30,30 
       ELSE 
          entry*size
       END
 FROM table;

UPD 期待される結果:

id | prize_pool
1 | 100
2 | 200
3 | 150,90,60
4 | 30,30,30,30,30

PythonのUPD2 同等の関数:

def prize_pool(entry,type,size):
    prize = entry*size
    if type == 0: 
        return [prize]
    if type == 1:
        return [prize * x for x in [0.5,0.3,0.2]]
    if type == 2:
        return [prize/int(size/3) for x in range(int(size/3))]
4

2 に答える 2

1

開始テーブルに名前が付けられていると仮定しますplop

SELECT
  plop.id,
  CASE
    WHEN plop.type = 1 THEN (SELECT array_agg(plop.entry * plop.size * val.x) FROM (VALUES (0.5), (0.3), (0.2)) val (x))::int4[]
    WHEN plop.type = 2 THEN (SELECT array_agg(3 * plop.entry * x/x ) FROM generate_series(1, plop.size / 3) x)::int4[]
    ELSE ARRAY[plop.entry * plop.size]::int4[]
  END AS prize_pool
FROM plop
;

それは次を返します:

┌────┬──────────────────┐                                                                                                                                                                                       
│ id │    prize_pool    │                                                                                                                                                                                       
├────┼──────────────────┤                                                                                                                                                                                       
│  1 │ {100}            │                                                                                                                                                                                       
│  2 │ {200}            │                                                                                                                                                                                       
│  3 │ {150,90,60}      │                                                                                                                                                                                       
│  4 │ {90,90,90,90,90} │                                                                                                                                                                                       
└────┴──────────────────┘

なぜならentry x size / ( size / 3 ) = 3 x entry

x/xは常に 1 に等しく、結果を配列として集計する必要があるセットを Postgres に示すために必要であることに注意してください。

それが役に立てば幸い。

于 2012-10-10T15:13:37.303 に答える
0

注目すべき 2 つの関数は、要素の集合を配列として取得できる array_agg() と、これらを文字列に追加できる string_agg です。

例えば:

SELECT type, array_agg(size) from mytable group by type;  

示すだろう

type | size
-----------------
   0 | {10,10}
   1 | {10}
   2 | {15}
(3 rows)

Python のドライバーについてはわかりませんが、Python 構造に解析してくれるドライバーかもしれません。

于 2012-10-10T14:00:17.527 に答える