В MySQL почему это происходит, ЕСЛИ возвращается false?

StackOverflow https://stackoverflow.com/questions/1423326

  •  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'

оцените то, как они это делают...

Это было полезно?

Решение

От MySQL - сервер

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*

Эти двое *снявшийся* строки показывают эквивалентные сравнения, если вы понимаете, что я имею в виду.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top