簡體   English   中英

在WHERE子句中使用CASE

[英]using CASE in the WHERE clause

我的查詢的簡化版本

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

這不起作用。 我想要做的是僅為id<800行添加success=1 ,否則忽略此檢查。

我怎么寫這個? 謝謝!

編輯:澄清,這是表格的樣子

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

我試圖返回所有行,列pw不能被忽略。

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

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

這意味着如果id <800,則成功必須為1才能將條件評估為true。 否則,無論如何都是如此。

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

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

這意味着:如果id <800,則返回success=1 (可以是TRUE或FALSE),否則返回TRUE。

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

這是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)

您可以將邏輯蘊涵A => BNOT A or B 這是最基本的邏輯法則之一。 在你的情況下,它是這樣的:

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

我還將NOT id<800轉換為id>=800 ,這也是非常基本的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM