2012-11-22 164 views
2

sql(postgres)是否可以创建一个查询条件来匹配5条可能的3个条件?目前我还没有到达任何地方,我被卡住了。 Plz,帮帮忙。SQL - 与5关键字匹配3

+2

“标准”是什么意思?你打算有三个不同的列或三个不同的列值? – DonCallisto

+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)

+0

你是对的,而且都很好。为什么我不能考虑这个问题。我接受之前发布的人。 Sry基因。 – Christian

+1

使用'with t(val)as(values(1),(2),(4),(6))'可以以更紧凑的方式写入虚拟数据的“代”。我个人认为它比union all语法更具可读性。 –

+0

感谢您向我展示sqlfiddle和您的积极答案。 – Christian

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语句与原始问题更相关。

+1

这不是有效的PostgreSQL语句。 –