2012-03-26 4 views
2

Как сделать условие с логическим ИЛИ в SQL (MySQL), чтобы под-условия выполнялись по мере необходимости?

Например:
логический ИЛИ в MySQL

SELECT * FROM \`mytable\` WHERE (\`a\` || \`b\` || \`c\`) 

`a` ЛОЖЬ
` b` ИСТИНА
`c` ЛОЖЬ или ИСТИНА

Я хочу MySQL:

1) получить `a`                                                                   // ОК, `a` ЛОЖЬ
2) если (` a` IS TRUE) break                 // без перерыва
3) не получают `b`                                                               // ok, `b` is TRUE
4) если (` b` IS TRUE) break;                 // нормально, ломают

+2

Глядя на последнюю часть вашего вопроса, вы спрашиваете, является ли выражение 'А или OR c' [коротких замыканий] (http://stackoverflow.com/questions/ 6960767/DO-современный-DBMS-включает в себя-короткое замыкание булевой-оценка)? – onedaywhen

ответ

1

Логическое OR уже ведет себя таким образом.

Однако то, что считается оценкой этих выражений, не обязательно означает то, что вы ожидаете, например. база данных все равно может потребоваться для извлечения всех строк, относящихся к выражению. В частности, MySQL can't always use indexes if you use OR.

BTW: Вы должны использовать OR, который является стандартным синтаксисом SQL. || в ANSI SQL (другие базы данных и режим ANSI в MySQL) объединяет строки.

0

Если они булевы поля Попробуйте использовать этот

SELECT * FROM `mytable` WHERE `a` OR `b` OR `c` 
+0

my 'c' является подзапросом (SELECT * FROM' mytable2' WHERE ... LIMIT 1) – user1292621

0

Чтобы получить то, что вы хотите, вы просто должны изменить порядок операндов. Как только операнд OR равен TRUE, условие не будет дополнительно оцениваться.Чтобы достичь высокой производительности, вы должны поместить операнды, которые, скорее всего, верны перед другими.

Вы не хотите перерыва, если a ИСТИНА? Попробуйте для начала:

SELECT * FROM `mytable` WHERE `c` OR `b` OR `a` 
Смежные вопросы