2009-09-14 59 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' 

這似乎有點違反直覺的,它評估字符串,它並看到路as

SELECT IF(1, 'one', 'not one'); -- 'one' 

SELECT IF('1', 'one', 'not one'); -- 'one' 

評估,他們這樣做的方式......

回答

6

MySQL

IF(表達式1,表達式2,表達式3)

如果expr1 TRUE(表達式1 <> 0且expr1的<> NULL)然後IF()返回 表達式2;否則它返回expr3。 IF()返回數值或字符串 值,具體取決於使用它的 中的上下文。

所以1是真的,因爲1!= 0和1!= NULL。這就像你會在C中看到的一樣。

但是對於一個字符串來說,'test'的計算結果爲true並沒有真正的基礎,並且沒有邏輯意義。它需要與布爾結果進行比較。

+0

煩人的說,如果IF('1','一','不是一個');返回'one' – SeanJA 2009-09-14 19:32:07

+0

什麼是SELECT'IF('2','two','not two');'do? – Rudie 2011-04-17 11:32:58

2

因爲「串」既不是真也不假,第一個表達式的值應該爲一個布爾值。

爲什麼IF(1,...)評估爲真?好問題。也許是回到C(即如果它是1,那麼它是真的)?

編輯:實際上,通過在http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_if的命令的定義,表達式1是TRUE,如果表達式1 <> 0且expr1的<> NULL,表達式1 == 1

+0

你是絕對正確的,但顯然這在MySQL的背後有不同的處理方式,即期望似乎是在expr1中出現一個數字或布爾值的評估,這會妨礙使用字符串作爲表達式。 – 2009-09-14 19:19:40

5

The first argument given to IF() is a predicate時是這種情況。字符串不被MySQL視爲謂詞,所以它默認爲false。至於你的最後一種情況,很多語言(C,Perl等)都認爲非零整數是真的,所以MySQL只是簡單地支持這個範例。

1

注意,有在PHP的相似之處:

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

的混亂似乎發生,因爲對比MySQL與0(和空)來獲得的東西布爾值。在其他語言中,如PHP和Javascript,當轉換爲布爾型時,字符串在非空(或不爲「0」)時返回true。

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

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

兩個*出演*行顯示了相當的比較,如果你知道我的意思。

相關問題