В MySQL, почему этот IF возвращает false? - PullRequest
2 голосов
/ 14 сентября 2009

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

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

Ответы [ 4 ]

6 голосов
/ 14 сентября 2009

С MySQL

IF (expr1, expr2, expr3)

Если expr1 равен TRUE (expr1 <> 0 и expr1 <> NULL), тогда IF () возвращает expr2; в противном случае возвращается expr3. IF () возвращает число или строку значение, в зависимости от контекста в который используется.

Итак, 1 верно, потому что 1! = 0 и 1! = NULL. Это похоже на то, что вы увидите в C.

Но для строки, говоря, что 'test' оценивается как true, не имеет реальной основы в определении и не имеет логического смысла. Это нужно сравнить с чем-то для логического результата.

5 голосов
/ 14 сентября 2009

Первый аргумент IF() - это предикат . MySQL не считает предикат строкой, поэтому по умолчанию используется значение false. Что касается вашего последнего случая, многие языки (C, Perl и т. Д.) Считают целые ненулевые значения true, поэтому MySQL просто поддерживает эту парадигму.

2 голосов
/ 14 сентября 2009

Поскольку 'string' не является ни истиной, ни ложью, и первое выражение должно иметь логическое значение.

Почему IF (1, ...) оценивается как истина? Хороший вопрос. Может быть, возврат к C (то есть, если это 1, то это правда)?

РЕДАКТИРОВАТЬ: На самом деле, по определению команды в http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_if, expr1 равен TRUE, если expr1 <> 0 и expr1 <> NULL, что имеет место при expr1 == 1.

1 голос
/ 22 сентября 2009

Обратите внимание, что в PHP есть сходства:

"string" != 0 // false
"one"    != 0 // false
"1"      != 0 // true

Кажется, что возникает путаница, потому что MySQL сравнивается с 0 (и нулем), чтобы получить логическое значение чего-либо. В других языках, таких как PHP и Javascript, при приведении к логическому значению строка возвращает значение true, если оно не пустое (или не равно «0»).

// php
0 == true          // false
"string" == 0      // true*
"string" == true   // true

// mysql
if(0, "true", "false")   // false
if("string", "true", "false") // false*

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...