, используя 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
источник
  • Возможно, это может вам помочь: stackoverflow.com/questions/14608245/... –  cheesemacfly 30.01.2013 в 22:56
  • Вы также можете добавить свой желаемый результат? –  Hamlet Hakobyan 30.01.2013 в 23:01

4 ответа

38

Вам не нужно использовать 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
источник
11
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
источник
  • Приобретено, потому что aligment и indentation делают код более понятным. –  Jose Manuel Abarca Rodríguez 07.11.2017 в 23:01
  • CASE - это путь! –  Maduka Jayalath 04.05.2018 в 08:31
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
источник
2

Это рабочий пример 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
источник
  • lemme попробуйте это. –  ichimaru 11.05.2018 в 09:41