Подтвердить что ты не робот

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

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

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 нельзя игнорировать.

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

Вы можете преобразовать логическую импликацию 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, что также довольно просто.

Ответ 4

Это рабочий пример 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)