2

sql (postgres) を使用して、5 つの条件のうち 3 つの条件に一致するエントリを検索するクエリを作成することは可能ですか? 現時点ではどこにも行けず、立ち往生しています。Plz、助けてください。

4

2 に答える 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 に答える