python - 使用 IN 运算符比较多列
问题描述
假设我有以下架构:
CREATE TABLE keys (
keytype INTEGER,
keyvalue CHARACTER VARYING(30),
object_id INTEGER NOT NULL
);
CREATE INDEX ix_keys ON keys (keytype, keyvalue);
我想搜索 和 的多种keytype
组合keyvalue
。一种方法是结合 AND 和 OR,例如:
SELECT object_id FROM keys WHERE
(keytype=1 AND keyvalue='ALICE') OR
(keytype=1 AND keyvalue='BOB') OR
(keytype=2 AND keyvalue='5552319912') OR
(keytype=3 AND keyvalue='938477') OR
...
但是对于库(目前使用 Python psycopg2 但可以是任何人),我想编写一个 SQL 并发送一个元组列表作为参数。是否有运营商这样做并且仍然使用索引?(我知道IN
只适用于单列)
我知道这不起作用:
find_keys = [
(1, 'ALICE'),
(1, 'BOB'),
(2, '5552319912'),
(3, '938477'),
]
cursor.execute("SELECT object_id FROM keys WHERE (keytype, keyvalue) IN %s", (find_keys,))
解决方案
你实际上很接近。将 find_keys 更改为元组的元组:
find_keys = (
(1, 'ALICE'),
(1, 'BOB'),
(2, '5552319912'),
(3, '938477'),
)
cur.execute("SELECT object_id FROM keys WHERE (keytype, keyvalue) IN %s", (find_keys,))
您不能使用列表,因为它已被 psycopg2 转换为数组。在 postgres 中比较对象集是有效的。
推荐阅读
- python - 如何将字典附加到字典字典
- firebase - 如何根据用户注册的位置设置不同的自定义声明?
- c++ - C++ 可变参数模板推导失败
- mongodb - 存储在地图中的数据,需要数组中所有对象的所有值
- javascript - 故事书 6 - 错误:您同时拥有“主”和“配置”。请从您的 configDir 中删除“config”文件
- postgresql - 获取超过 Postgres 中选定输入的日期
- scala - 用于 ftp 的 Scala zio
- javascript - Webpack 的实际版本 - ValidationError: Style Loader Invalid Options options should NOT have additional properties
- node.js - 使用 SuperTest 进行测试时保持会话
- amazon-iam - 策略中的主体无效:MalformedPolicyDocument