2009-09-14 2 views
2

В MySql, если первым аргументом функции IF() является строка, почему она возвращает false?В 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' 

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

ответ

6

От MySQL

ЕСЛИ (выражение1, выражение2, выражение3)

Если выражение1 ИСТИНА (выражение1 <> 0 и выражение1 <> NULL), то ЕСЛИ() возвращает expr2; в противном случае он возвращает expr3. IF() возвращает числовое значение или значение строки в зависимости от контекста в , который используется.

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

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

+0

раздражает, что SELECT IF ('1', 'one', 'not one'); возвращает 'one' – SeanJA

+0

И что делает SELECT 'IF ('2', 'two', 'not two');' do ?? – Rudie

2

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

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

EDIT: На самом деле, по определению команды на http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_if, выражение1 ИСТИНА, если выражение1 <> 0 и выражение1 <> NULL, который является тот случай, когда expr1 == 1.

+0

Вы абсолютно правы, но, по-видимому, это обрабатывается по-разному под капотом в MySQL, т. Е. Ожидается, что числовые или логические оценки происходят в expr1, что исключает использование строки в качестве выражения. –

5

The first argument given to IF() is a predicate. Строка не считается предикатом MySQL, поэтому по умолчанию используется значение false. Что касается вашего последнего случая, многие языки (C, Perl и т. Д.) Считают ненулевые целые числа true, поэтому MySQL просто поддерживает эту парадигму.

1

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

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

Беспорядок, кажется, возникает потому, что MySQL сравнивает до 0 (и нуль), чтобы получить логическое значение чего-либо. В других языках, таких как 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* 

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

Смежные вопросы