, используя CASE в предложении WHERE

17

упрощенная версия моего запроса

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

это не работает. То, что я пытаюсь сделать, это добавить success=1 только для строк с id<800 , иначе игнорировать эту проверку.

как мне это написать? спасибо!

edit: уточнить, что выглядит таблица

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

Я пытаюсь вернуть все строки, столбцы pw не могут быть проигнорированы.

    
задан phz 30.01.2013 в 22:54
источник

4 ответа

32

Вам не нужно использовать CASE ... КОГДА вы можете использовать условие ИЛИ, например:

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

это означает, что если id & lt; 800, успех должен быть равен 1, чтобы условие было оценено как истинное. Иначе это будет так или иначе.

Это реже, но вы все равно можете использовать CASE WHEN, например:

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

это означает: return success=1 (который может быть TRUE или FALSE) в случае id & lt; 800 или всегда возвращает TRUE в противном случае.

    
ответ дан fthiella 30.01.2013 в 22:57
источник
6
SELECT *
FROM logs
WHERE pw='correct'
  AND CASE
          WHEN id<800 THEN success=1
          ELSE 1=1
      END
  AND YEAR(TIMESTAMP)=2011
    
ответ дан Chirag 25.03.2014 в 11:18
источник
4

Вы можете преобразовать логическую импликацию A => B в NOT A or B . Это один из самых основных законов логики. В вашем случае это примерно так:

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

Я также преобразовал NOT id<800 в id>=800 , что также довольно просто.

    
ответ дан Rok Kralj 30.01.2013 в 22:58
источник
1

Это рабочий пример Oracle, но он также должен работать в MySQL.

Вам не хватает smth - см. IN после END Заменить «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)
    
ответ дан Art 30.01.2013 в 23:05
источник