postgresql 使用“in”和“and”运算符筛选记录的条件

yduiuuwa  于 2023-06-05  发布在  PostgreSQL
关注(0)|答案(3)|浏览(143)

| ID|姓名|可搜索|
| - -----|- -----|- -----|
| 1|福|真的|
| 2|酒吧|真的|
| 3|扎尔|错误|
我有一些ids,我需要过滤记录中有isSearchable = true的记录。
这个查询给予的结果是ID = 1,因为它是可搜索的,但是我会对整个结果应用isSearchable过滤器,而不是逐行。

SELECT *
FROM my_table
WHERE id IN (1, 3)
  AND isSearchable = true

因此,在本例中,我期望no-results,因为两条记录都应该在第一个isSearchable中,然后过滤id。
我试过使用子查询等,但in运算符(或or运算符),但我无法完成结果。
也许是很简单的事情,但我不知道如何解决。谢谢你的帮助

li9yvcax

li9yvcax1#

使用窗口函数的一种方法:

SELECT ID 
FROM (SELECT ID,
             MIN(isSearchable::INT) OVER() AS minSearchable
      FROM my_table
      WHERE id IN (1,3)) cte 
WHERE minSearchable = 1

查看演示here

m3eecexj

m3eecexj2#

如果您按照制定任务的方式编写查询,则它将以某种方式如下所示

with t2 as (
select id, name, is_searcheable
from t
where id in (1,3)
)
select * from t2
where not exists
  (select null from t2 where not is_searcheable);
  • 获取行1 and 3,如果它们都不是可搜索的 * -现在返回行; for 1 and 2返回两行。
vhipe2zx

vhipe2zx3#

这个怎么样?

SELECT *
FROM (
    SELECT *
    FROM my_table
    WHERE id IN (1,3)
) x
WHERE isSearchable = true;

想想通用编程语言:

jshell> Integer x;
x ==> null

jshell> if(x == 3 || x == null) System.out.println("bad");
|  Exception java.lang.NullPointerException: Cannot invoke "java.lang.Integer.intValue()" because "REPL.$JShell$11.x" is null
|        at (#2:1)

jshell> if(x == null || x == 3) System.out.println("bad");
bad

过滤顺序可以完全改变结果。如果显式地编写查询,使执行计划不被解释,那就很好了。

相关问题