В SQL, все логические операторы возвращают
TRUE (ИСТИНА), FALSE (ЛОЖЬ) или NULL (UNKNOWN, неизвестно).
В MySQL это реализовано как 1
(TRUE, ИСТИНА), 0
(FALSE, ЛОЖЬ)
или NULL
. Это справедливо для большинства SQL СУБД, однако некоторые
возвращают любое положительное значение как значение TRUE.
NOT
!
1
, если операнд равен 0
, 0
если операнд -
ненулевая величина, и NOT NULL
возвращает NULL
.
mysql> SELECT NOT 10; -> 0 mysql> SELECT NOT 0; -> 1 mysql> SELECT NOT NULL; -> NULL mysql> SELECT ! (1+1); -> 0 mysql> SELECT ! 1+1; -> 1Последний пример дает
1
, поскольку данное выражение вычисляется тем же
способом, что и (!1)+1
.
AND
&&
1
если все операнды ненулевые и не NULL
, 0
если один
или более операндов равны 0
, или NULL
в остальных случаях.
mysql> SELECT 1 && 1; -> 1 mysql> SELECT 1 && 0; -> 0 mysql> SELECT 1 && NULL; -> NULL mysql> SELECT 0 && NULL; -> 0 mysql> SELECT NULL && 0; -> 0Обратите внимание, что версии MySQL до 4.0.5 прекращали вычисление, встретив первый
NULL
, вместо того, чтобы продолжать вычисление выражений с целью
нахождения возможных значений 0
. Это означает, что в этих версиях
выражение SELECT (NULL AND 0)
возвращает NULL
вместо 0
. В
4.0.5 код был переписан так, чтобы оптимизация сохранилась, но результат всегда
был таков, как требует того ANSI.
OR
||
1
, если любой из операндов не 0
, NULL
если один
из операндов NULL
, в остальных случаях возвращает 0
.
mysql> SELECT 1 || 1; -> 1 mysql> SELECT 1 || 0; -> 1 mysql> SELECT 0 || 0; -> 0 mysql> SELECT 0 || NULL; -> NULL mysql> SELECT 1 || NULL; -> 1
XOR
NULL
если
любой из операндов - NULL
. Для не-NULL
операндов, возвращает
1
если нечетное количество операндов - не 0
.
mysql> SELECT 1 XOR 1; -> 0 mysql> SELECT 1 XOR 0; -> 1 mysql> SELECT 1 XOR NULL; -> NULL mysql> SELECT 1 XOR 1 XOR 1; -> 1
a XOR b
математически эквалиентно
(a AND (NOT b)) OR ((NOT a) and b)
.
XOR
был реализован в 4.0.2.
User Comments
XOR is useful for throwing a boolean switch with just a single query. For example:
mysql> update mytable set mytable.switch=1 XOR mytable.switch where [condition];
will toggle a boolean field 'switch' from 1 to 0 or 0 to 1.
Hope that's useful,
christo
An alternative to your use of XOR is ABS(x-1) if you are using 0 and 1 switches.
Or you could just use the NOT operator, as in
update mytable set mytable.switch=NOT mytable.switch where [condition];
When evaluating expressions, MySQL (4.0.17) seems to give XOR the same precedence as LIKE, while it gives OR a lower precedence. That is,
1 LIKE 2 XOR 2 LIKE 1 is evaluated as
((1 LIKE 2) XOR 2) LIKE 1) and comes out true, instead of being evaluated as
(1 LIKE 2) XOR (2 LIKE 1), which is false, or even as
1 LIKE (2 XOR 2) LIKE 1, which is also false.
However, 1 LIKE 2 OR 2 LIKE 1 is evaluated as (1 LIKE 2) OR (2 LIKE 1), and comes out false.
This should be resolved in a later build. Until then, if you combine LIKE and XOR in a query, make sure to use parentheses to make the priority clear.
Add your own comment.