2012-11-22 120 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語句。 –