47

私のクエリの簡易版

SELECT *
FROM logs 
WHERE pw='correct' AND CASE WHEN id<800 THEN success=1 ELSE END 
AND YEAR(timestamp)=2011 

これは機能しません。私がやろうとしているのはsuccess=1、 の行にのみ追加することid<800です。それ以外の場合は、このチェックを無視します。

これはどうやって書くの?ありがとう!

編集:明確にするために、これはテーブルがどのように見えるかです

|id  | pw      | success |
--------------------------
|700 | correct | 1       |
|710 | correct | 1       |
|900 | correct | NULL    |
|999 | correct | 0       |

すべての行を返そうとしていますが、列pwは無視できません。

4

4 に答える 4

81

CASEを使用する必要はありません...この場合、次のようにOR条件を使用できます。

WHERE
  pw='correct'
  AND (id>=800 OR success=1) 
  AND YEAR(timestamp)=2011

これは、id <800の場合、条件がtrueと評価されるためには成功が1でなければならないことを意味します。そうでなければ、とにかくそれは本当です。

あまり一般的ではありませんが、次のようにCASEWHENを使用することもできます。

WHERE
  pw='correct'
  AND CASE WHEN id<800 THEN success=1 ELSE TRUE END 
  AND YEAR(timestamp)=2011

つまり、id <800の場合はreturn success=1(TRUEまたはFALSEの場合があります)、それ以外の場合は常にTRUEを返します。

于 2013-01-30T21:57:53.673 に答える
18

これは動作する Oracle の例ですが、MySQL でも動作するはずです。

smth がありません - END の後の IN を参照してください 'IN' を単一の値の '=' 記号に置き換えてください。

SELECT empno, ename, job
  FROM scott.emp
 WHERE (CASE WHEN job = 'MANAGER' THEN '1'  
         WHEN job = 'CLERK'   THEN '2' 
         ELSE '0'  END) IN (1, 2)
于 2013-01-30T22:05:07.640 に答える
4

A => B論理的含意を に変換できますNOT A or B。これは論理の最も基本的な法則の 1 つです。あなたの場合、それは次のようなものです:

SELECT *
FROM logs 
WHERE pw='correct' AND (id>=800 OR success=1)  
AND YEAR(timestamp)=2011

にも変身NOT id<800しましたがid>=800、これもかなり基本的なものです。

于 2013-01-30T21:58:25.363 に答える