我有一个python值列表和一个带有特定列的postgresql表。对于python列表中的每个元素,我想知道表中是否有带有该ID的行。
例如,假设我有一个python列表:
vals = [4, 8, 15, 16, 23, 42]此外,该查询:
select my_col from my_table;给予:
[4, 5, 6, 7, 8]那么,我想要一个返回的查询:
[True, True, False, False, False, False]我可以循环遍历列表,并为每个值执行一个新的"select exists“,但是我想知道是否有一种方法可以在单个调用中完成?
我只限于postgresql 9.0
发布于 2015-01-08 20:19:13
这个问题更多地是关于SQL的,而不是aboyt或psycopg。我会使用这样的查询:
SELECT my_col = ANY(your_array_here) FROM my_table;要获得“表顺序”的结果,或:
SELECT A.x = ANY(SELECT my_col FROM my_table)
FROM (SELECT * FROM unnest(your_array_here) x) A;才能得到“订单”的结果。
幸运的是,足够多的内核提供了一个默认适配器,该适配器将Python转换为PostgreSQL数组,代码非常简单:
curs.execute("SELECT my_col = ANY(%s) from my_table", (vals,))或者:
curs.execute("""SELECT A.x = ANY(SELECT my_col FROM my_table)
FROM (SELECT * FROM unnest(%s) x) A""", (vals,))请注意,绑定变量参数应该是dict或元组,您希望将完整的列表绑定到查询中的单个变量,这意味着您应该使用一个1元素元组((vals,)),而不是试图直接传递vals。
发布于 2015-01-08 18:02:57
我认为这需要字符串格式和占位符的混合(因为在vals中每项都需要一个vals):
vals = [4, 8, 15, 16, 23, 42]
query = 'select distinct(my_col) from my_table where my_col in ('
query += ', '.join(['%s'] * len(vals))
query += ')'
cursor.execute(query, vals)
theset = {t[0] for t in cursor.fetchall()}
theboollist = [v in theset for v in vals]这种方法应该确保您发送到DB的数据量(对于where ... in子句)和从中获得的数据量都是O(N),其中N等于len(vals);我认为,从逻辑上讲,在大O条件下不可能做得更好。
https://stackoverflow.com/questions/27846033
复制相似问题