在做對mysql的資料查詢中,會遇到條件為0 不判斷條件,條件有值判斷查詢的情況.
例如:

  1. DROP TABLE IF EXISTS `test`;  
  2. CREATE TABLE `test` (  
  3.   `ID` int(11) NOT NULL AUTO_INCREMENT,  
  4.   `dataclass` varchar(25) COLLATE gbk_bin DEFAULT NULL,  
  5.   `class` varchar(25) COLLATE gbk_bin DEFAULT NULL,  
  6.   `countvarchar(25) COLLATE gbk_bin DEFAULT NULL,  
  7.   PRIMARY KEY (`ID`)  
  8. ) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=gbk COLLATE=gbk_bin;  
  9.  
  10. INSERT INTO test VALUES (`1``2004-02``au``32`);  
  11. INSERT INTO test VALUES (`2``2004-02``vaio``56`);  
  12. INSERT INTO test VALUES (`3``2004-03``au``38`);  
  13. INSERT INTO test VALUES (`4``2004-03``pb``55`); 

  要檢索test中的資料,當條件 ID 為0時查詢出所有的資料,當 ID不為0時查詢出 對應的資料。
 用mysql的控制流函式可以很簡單的實現.

  1. <?php  
  2. $ID = 1;  
  3. $con = mysql_connect("localhost""root""321");  
  4. if (!$con)  
  5.   {  
  6.   die(`Could not connect: ` . mysql_error());  
  7.   }  
  8. $db_selected = mysql_select_db("test",$con);  
  9.  
  10. $sql = "SELECT * FROM test where ID = IF($ID<>0,$ID,ID)";  
  11.  
  12. $result = mysql_query($sql,$con);  
  13. print_r(mysql_fetch_array($result));  
  14. mysql_close($con);  
  15. ?> 

控制流函式詳解:

  • CASE value WHEN [compare-value] THEN result [WHEN [compare-value] THEN result …] [ELSE result] END CASE WHEN [condition] THEN result [WHEN [condition] THEN result …] [ELSE result] END

在第一個方案的返回結果中, value=compare-value。而第二個方案的返回結果是第一種情況的真實結果。如果沒有匹配的結果值,則返回結果為ELSE後的結果,如果沒有ELSE 部分,則返回值為 NULL

mysql> SELECT CASE 1 WHEN 1 THEN `one`

    ->     WHEN 2 THEN `two` ELSE `more` END;

        -> `one`

mysql> SELECT CASE WHEN 1>0 THEN `true` ELSE `false` END;

        -> `true`

mysql> SELECT CASE BINARY `B`

    ->     WHEN `a` THEN 1 WHEN `b` THEN 2 END;

        -> NULL

一個CASE表示式的預設返回值型別是任何返回值的相容集合型別,但具體情況視其所在語境而定。如果用在字串語境中,則返回結果味字串。如果用在數字語境中,則返回結果為十進位制值、實值或整數值。 

  • IF(expr1,expr2,expr3)

如果 expr1 TRUE (expr1 <> 0 and expr1 <> NULL),則 IF()的返回值為expr2; 否則返回值則為 expr3IF() 的返回值為數字值或字串值,具體情況視其所在語境而定。

mysql> SELECT IF(1>2,2,3);

        -> 3

mysql> SELECT IF(1<2,`yes `,`no`);

        -> `yes`

mysql> SELECT IF(STRCMP(`test`,`test1`),`no`,`yes`);

        -> `no`

如果expr2 expr3中只有一個明確是 NULL,則IF() 函式的結果型別 為非NULL表示式的結果型別。

expr1 作為一個整數值進行計算,就是說,假如你正在驗證浮點值或字串值,   那麼應該使用比較運算進行檢驗。

mysql> SELECT IF(0.1,1,0);

        -> 0

mysql> SELECT IF(0.1<>0,1,0);

        -> 1

在所示的第一個例子中,IF(0.1)的返回值為0,原因是 0.1 被轉化為整數值,從而引起一個對 IF(0)的檢驗。這或許不是你想要的情況。在第二個例子中,比較檢驗了原始浮點值,目的是為了瞭解是否其為非零值。比較結果使用整數。

IF() (這一點在其被儲存到臨時表時很重要 ) 的預設返回值型別按照以下方式計算:

表示式

返回值

expr2 expr3 返回值為一個字串。

字串

expr2 expr3 返回值為一個浮點值。

浮點

expr2 expr3 返回值為一個整數。 

整數

假如expr2 expr3 都是字串,且其中任何一個字串區分大小寫,則返回結果是區分大小寫。

  • IFNULL(expr1,expr2)

假如expr1 不為 NULL,則 IFNULL() 的返回值為 expr1; 否則其返回值為 expr2IFNULL()的返回值是數字或是字串,具體情況取決於其所使用的語境。

mysql> SELECT IFNULL(1,0);

        -> 1

mysql> SELECT IFNULL(NULL,10);

        -> 10

mysql> SELECT IFNULL(1/0,10);

        -> 10

mysql> SELECT IFNULL(1/0,`yes`);

        -> `yes`

IFNULL(expr1,expr2)的預設結果值為兩個表示式中更加“通用”的一個,順序為STRING REAL INTEGER。假設一個基於表示式的表的情況,  MySQL必須在記憶體儲器中儲存一個臨時表中IFNULL()的返回值:

CREATE TABLE tmp SELECT IFNULL(1,`test`) AS test

在這個例子中,測試列的型別為 CHAR(4)

  • NULLIF(expr1,expr2)

如果expr1 = expr2  成立,那麼返回值為NULL,否則返回值為 expr1。這和CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END相同。

mysql> SELECT NULLIF(1,1);

        -> NULL

mysql> SELECT NULLIF(1,2);

        -> 1

注意,如果引數不相等,則 MySQL 兩次求得的值為  expr1