В MySQL почему это происходит, ЕСЛИ возвращается false?
-
07-07-2019 - |
Вопрос
В MySQL, если первым аргументом функции IF() является строка, почему она возвращает false?
SELECT IF('string', 'string', 'not string'); -- 'not string'
Конечно, я мог бы как-то исправить это, если бы сделал
IF(!ISNULL('string'), 'string', 'not string')) -- 'string'
или
IFNULL('string', 'not string'); -- 'string'
Кажется несколько нелогичным, что он оценивает строку так, как он это делает, рассматривая как
SELECT IF(1, 'one', 'not one'); -- 'one'
и
SELECT IF('1', 'one', 'not one'); -- 'one'
оцените то, как они это делают...
Решение
IF(выражение 1, выражение 2, выражение 3)
Если expr1 имеет значение TRUE (expr1 <> 0 и выражение 1 <> NULL), затем IF() возвращает выражение 2;в противном случае он возвращает expr3 .Если() возвращает числовое или строковое стоимость, в зависимости от контекста которой он используется.
Итак, 1 истинно, потому что 1 != 0 и 1 != NULL.Это похоже на то , что вы увидели бы в C.
Но для строки утверждение, что 'test' принимает значение true, не имеет реальной основы в определении и не имеет логического смысла.Это нужно сравнить с чем-то для получения логического результата.
Другие советы
Первый аргумент , приведенный к IF()
является предикатом.Строка не считается MySQL предикатом, поэтому по умолчанию она имеет значение false.Что касается вашего последнего случая, многие языки (C, Perl и т.д.) считают ненулевые целые числа истинными, поэтому MySQL просто поддерживает эту парадигму.
Потому что 'string' не является ни true, ни false, и первое выражение должно принимать логическое значение.
Почему IF(1, ...) принимает значение true?Хороший вопрос.Может быть, возврат к C (т.е.если это 1, то это правда)?
Редактировать:На самом деле, по определению команды в http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_if, expr1 имеет значение TRUE , если expr1 <> 0 и выражение 1 <> NULL, что имеет место в случае, когда expr1 == 1.
Обратите внимание, что в PHP есть сходства:
"string" != 0 // false
"one" != 0 // false
"1" != 0 // true
Путаница, по-видимому, возникает из-за того, что MySQL сравнивает с 0 (и null), чтобы получить логическое значение чего-либо.В других языках, таких как PHP и Javascript, строка, при преобразовании в boolean, возвращает true, если она непустая (или не "0").
// php
0 == true // false
"string" == 0 // true*
"string" == true // true
// mysql
if(0, "true", "false") // false
if("string", "true", "false") // false*
Эти двое *
снявшийся*
строки показывают эквивалентные сравнения, если вы понимаете, что я имею в виду.