SQL - 匹配5个标准中的3个

时间:2012-11-22 08:24:36

标签: sql postgresql

是否可以使用sql(postgres)进行查询,以查找与5个可能的3个标准匹配的条目?我现在没有到达任何地方,我被困住了。 Plz,帮忙。

2 个答案:

答案 0 :(得分:7)

这是解决此问题的详细而直接的解决方案:

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

你也可以通过半连接unnested数组来做技巧:

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)

中唯一匹配至少三个条件的记录

答案 1 :(得分:3)

SELECT * FROM table 
WHERE IF(crit1, 1,0)
+ IF(crit2, 1,0)
+ IF(crit3, 1,0)
+ IF(crit4, 1,0)
+ IF(crit5, 1,0) >= 3

[编辑]根据以下评论,这不是有效的postgres。这是如何在MySQL中完成的,我只是假设它是标准的... CASE语句与原始问题更相关。