首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在心理学2/postgresql中检查python值列表的存在性

在心理学2/postgresql中检查python值列表的存在性
EN

Stack Overflow用户
提问于 2015-01-08 17:26:50
回答 2查看 2.7K关注 0票数 3

我有一个python值列表和一个带有特定列的postgresql表。对于python列表中的每个元素,我想知道表中是否有带有该ID的行。

例如,假设我有一个python列表:

代码语言:javascript
复制
vals = [4, 8, 15, 16, 23, 42]

此外,该查询:

代码语言:javascript
复制
select my_col from my_table;

给予:

代码语言:javascript
复制
[4, 5, 6, 7, 8]

那么,我想要一个返回的查询:

代码语言:javascript
复制
[True, True, False, False, False, False]

我可以循环遍历列表,并为每个值执行一个新的"select exists“,但是我想知道是否有一种方法可以在单个调用中完成?

我只限于postgresql 9.0

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-08 20:19:13

这个问题更多地是关于SQL的,而不是aboyt或psycopg。我会使用这样的查询:

代码语言:javascript
复制
SELECT my_col = ANY(your_array_here) FROM my_table;

要获得“表顺序”的结果,或:

代码语言:javascript
复制
SELECT A.x = ANY(SELECT my_col FROM my_table) 
  FROM (SELECT * FROM unnest(your_array_here) x) A;

才能得到“订单”的结果。

幸运的是,足够多的内核提供了一个默认适配器,该适配器将Python转换为PostgreSQL数组,代码非常简单:

代码语言:javascript
复制
curs.execute("SELECT my_col = ANY(%s) from my_table", (vals,))

或者:

代码语言:javascript
复制
curs.execute("""SELECT A.x = ANY(SELECT my_col FROM my_table) 
                  FROM (SELECT * FROM unnest(%s) x) A""", (vals,))

请注意,绑定变量参数应该是dict或元组,您希望将完整的列表绑定到查询中的单个变量,这意味着您应该使用一个1元素元组((vals,)),而不是试图直接传递vals

票数 3
EN

Stack Overflow用户

发布于 2015-01-08 18:02:57

我认为这需要字符串格式和占位符的混合(因为在vals中每项都需要一个vals):

代码语言:javascript
复制
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条件下不可能做得更好。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27846033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档