SQL - 从 5 个条件中匹配 3 个

标签 sql postgresql

是否可以使用 sql (postgres) 进行查询以搜索符合 5 个可能条件中的任何 3 个条件的条目?我现在什么也得不到,我被困住了。 请帮忙。

最佳答案

这是针对此问题的冗长但直接的解决方案:

SELECT * FROM t
WHERE (CASE t.val WHEN :criteria1 THEN 1 ELSE 0 END +
       CASE t.val WHEN :criteria2 THEN 1 ELSE 0 END +
       CASE t.val WHEN :criteria3 THEN 1 ELSE 0 END +
       CASE t.val WHEN :criteria4 THEN 1 ELSE 0 END +
       CASE t.val WHEN :criteria5 THEN 1 ELSE 0 END) >= 3

您还可以通过半连接未嵌套数组来做一些技巧:

SELECT * FROM t
WHERE (
  SELECT COUNT(*) 
  FROM UNNEST(ARRAY[:c1, :c2, :c3, :c4, :c5]) u(val)
  WHERE u.val = t.val
) >= 3

或者通过半连接 VALUES(...) 表达式

SELECT * FROM t
WHERE (
  SELECT COUNT(*) 
  FROM (VALUES (1), (1), (2), (2), (2)) u(val)
  WHERE u.val = t.val
) >= 3

这是一个工作示例,我已将其放在 SQL Fiddle 上:

WITH t(val) AS (
  VALUES (1), (2), (4), (6)
)
SELECT * FROM t
WHERE (
  SELECT COUNT(*) 
  FROM (VALUES (1), (1), (2), (2), (2)) u(val)
  WHERE u.val = t.val
) >= 3

以上将返回 2,因为它是唯一符合 (1, 1, 2, 2, 2) 中至少三个条件的记录

关于SQL - 从 5 个条件中匹配 3 个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13508479/

相关文章:

sql - 保证多个FK字段属于另一个表的同一行

mysql - 比较从最早的列开始的列值,直到它们的总和等于一个数字

sql - 使用 CTE 删除比在 Postgres 中使用临时表慢

java - 使用数据库作为任务队列

mysql - IN 子句中最高匹配的 ORDER 值

sql - PLpgSQL 函数结果上的 FOR 循环

php - 在 Controller 中应用函数后, View 不显示相同的内容

postgresql - 从 Postgresql View 获取下一条记录

c - 使用 hstore 在 C 中使用 PostgreSQL UDF

postgresql - 昨天在postgresql中的记录