sql - PostgreSQL。因此根据特定过滤器选择结果
问题描述
我有一张有用户的桌子。
用户(使用此程序)可以通过应用不同的过滤器来选择用户。必须立即应用过滤器以减少最终的搜索时间,SELECT
并且不会浪费时间。
目前我的代码看起来像这样(Python,不确定这是否有效,尚未测试)。
问题:
- 当我得到用户输入时,如何立即应用过滤器?
- 如何将与过滤相关的所有操作放入/传递到数据库?
if only_with_photo:
cursor.execute('SELECT tg_user_id FROM suers WHERE photo IS NOT NULL')
users_with_photo = cursor.fetchall()
if only_with_country:
cursor.execute('SELECT tg_user_id FROM suers WHERE country IS NOT NULL')
users_with_country = cursor.fetchall()
if only_with_city:
cursor.execute('SELECT tg_user_id FROM suers WHERE city IS NOT NULL')
users_with_city = cursor.fetchall()
cursor.execute('SELECT tg_user_id FROM users WHERE tg_user_id IN (users_with_photo) AND tg_user_id IN (users_with_country ) AND tg_user_id IN (users_with_city) )
任务:在 psql 中执行此查询而不使用 Python 或其他语言?
我试过了:
- 案子
sql = 'SELECT (CASE only_with_photo = 1 THEN (SELECT tg_user_id FROM users WHERE country IS NOT NULL)' --Subrequest returns more that one result
- 变量
/set only_with_photo := (SELECT tg_user_id FROM users WHERE birthdate IS NOT NULL); --Syntax just now working
解决方案
您可以使用灵活的谓词编写查询,并将其放入带有每个案例参数的过程中,如下所示:
SELECT tg_user_id
FROM users
WHERE (only_with_photo = 1 AND photo IS NOT NULL)
OR (only_with_county = 1 AND county IS NOT NULL)
OR (only_with_city = 1 AND city IS NOT NULL)
等等,但这不一定是最高效的做事方式,尽管它可能对你的情况来说已经足够好了。您可能希望根据上述谓词的一些最可能的组合向 users 表添加多个索引。
推荐阅读
- javascript - REACT: If Else 逻辑,大于 100
- java - 在 Java 代码中执行以下操作的等效 openssl 命令是什么
- sql - 如何连接来自两个不同表的数据?
- node.js - Firestore 承诺
- scala - 如何在scala中添加内部映射的元组值
- javascript - 从列行中选择随机单元格
- python - Python C API call to error() binds to libc implementation instead of a local one
- node.js - exceljs 以 csv 格式正确写入文件,但文件已损坏为 xlsx 格式
- double - 需要在 nvarchar 上使用双引号的 where 子句?
- javascript - 在对象数组上使用 Jest 属性匹配器