Используя 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
нельзя игнорировать.
Ответы
Ответ 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)