是否可以使用 sql (postgres) 进行查询,以搜索与 5 个可能的 3 个条件匹配的条目?我现在无处可去,我被困住了。请帮忙。
问问题
144 次
2 回答
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
您还可以通过半连接非嵌套数组来做一些技巧:
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)
于 2012-11-22T08:28:25.840 回答
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 语句与原始问题更相关。
于 2012-11-22T08:31:25.747 回答