在WHERE子句中使用CASE

phz*_*phz 28 mysql sql

我的查询的简化版本

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

这不起作用.我要做的是success=1仅为行添加id<800,否则忽略此检查.

我怎么写这个?谢谢!

编辑:澄清,这是表格的样子

|id  | pw      | success |
--------------------------
|700 | correct | 1       |
|710 | correct | 1       |
|900 | correct | NULL    |
|999 | correct | 0       |
Run Code Online (Sandbox Code Playgroud)

我试图返回所有行,列pw不能被忽略.

fth*_*lla 54

您不必使用CASE ... WHEN,您可以使用OR条件,如下所示:

WHERE
  pw='correct'
  AND (id>=800 OR success=1) 
  AND YEAR(timestamp)=2011
Run Code Online (Sandbox Code Playgroud)

这意味着如果id <800,则成功必须为1才能将条件评估为true.否则,无论如何都是如此.

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

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

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


Chi*_*rag 19

SELECT *
FROM logs
WHERE pw='correct'
  AND CASE
          WHEN id<800 THEN success=1
          ELSE 1=1
      END
  AND YEAR(TIMESTAMP)=2011
Run Code Online (Sandbox Code Playgroud)

  • Upvoted 因为对齐和缩进使代码更易于理解。 (2认同)

Art*_*Art 8

这是工作的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)
Run Code Online (Sandbox Code Playgroud)


Rok*_*alj 6

您可以将逻辑含义转换A => BNOT A or B. 这是最基本的逻辑定律之一。在你的情况下,它是这样的:

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

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