首页 > 解决方案 > PostgreSQL。因此根据特定过滤器选择结果

问题描述

我有一张有用户的桌子。

用户(使用此程序)可以通过应用不同的过滤器来选择用户。必须立即应用过滤器以减少最终的搜索时间,SELECT并且不会浪费时间。

目前我的代码看起来像这样(Python,不确定这是否有效,尚未测试)。

问题:

  1. 当我得到用户输入时,如何立即应用过滤器?
  2. 如何将与过滤相关的所有操作放入/传递到数据库?
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 或其他语言?

我试过了:

  1. 案子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
  2. 变量/set only_with_photo := (SELECT tg_user_id FROM users WHERE birthdate IS NOT NULL); --Syntax just now working

标签: sqlpostgresqlwhere-clausepsql

解决方案


您可以使用灵活的谓词编写查询,并将其放入带有每个案例参数的过程中,如下所示:

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 表添加多个索引。


推荐阅读