Redshift where子句使用多列

问题描述

假设我在 redshift 中有下表:

table
|   a |   b |
|----:|----:|
|   3 |   1 |
|   1 |   8 |
|   7 |   6 |
|   4 |   0 |
|   5 |   6 |
|   5 |   2 |
|   5 |   9 |
|   4 |   3 |
|   7 |   9 |
|   9 |   8 |

在python中,我具有以下元组列表:

x = [(3,1),(4,2),(10,(7,9),(5,(6,1)]

我想使用pd.read_sql_query`从元组(a,b)在x中的表中提取所有行。

如果我只有一列,那将是一个简单的sql WHERE子句,类似于:

query = f'''
SELECT *
FROM table
WHERE a IN {x_sql} 
'''

pd.read_sql_query(query,engine)

我的最终结果将是:

|   a |   b |
|----:|----:|
|   3 |   1 |
|   5 |   2 |
|   7 |   9 |

我想创建一个查询,例如:

#doesn't work
SELECT *
FROM table 
WHERE a,b IN ((3,1)) 

解决方法

IIUC,我们可以将.stackisin.loc一起使用以对索引进行过滤。

x = [(3,1),(4,2),(10,(7,9),(5,(6,1)]

df.loc[df.stack().groupby(level=0).agg(tuple).isin(x)]


       a      b 
1      3      1
6      5      2
9      7      9