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...WHEN,您可以使用 OR 条件,如下所示:

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

这意味着如果 id<800,成功必须为 1 才能将条件评估为真。否则,无论如何它都会是真的。

它不太常见,但是您仍然可以使用 CASE WHEN,如下所示:

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

这意味着:success=1在 id<800 的情况下返回(可以是 TRUE 或 FALSE),否则总是返回 TRUE。

于 2013-01-30T21:57:53.673 回答
31
SELECT *
FROM logs
WHERE pw='correct'
  AND CASE
          WHEN id<800 THEN success=1
          ELSE 1=1
      END
  AND YEAR(TIMESTAMP)=2011
于 2014-03-25T10:18:08.487 回答
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 => BNOT A or B. 这是最基本的逻辑规律之一。在您的情况下,它是这样的:

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

我也转换NOT id<800id>=800,这也很基本。

于 2013-01-30T21:58:25.363 回答