如何将以下python表达式翻译为postgesql?
>>> ','.join([30 for x in range(3)])
30,30,30
我有一个包含colums的表:
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
UPD2 python中的等价函数:
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))]
答案 0 :(得分: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表明它必须将结果聚合为数组。
希望它有所帮助。
答案 1 :(得分:0)
要查看的两个函数是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结构。