mysql中IFNULL,IF,CASE的區(qū)別介紹
更新時間:2012年11月27日 09:03:34 作者:
本文將詳細介紹mysql中IFNULL,IF,CASE的區(qū)別,需要了解的朋友可以參考下
假設(shè)有一數(shù)據(jù)表的狀態(tài)字段設(shè)計為varchar類型,有以下值:NULL,pending,pending refund,refund,cancel.
我們知道查詢狀態(tài)為cancel的訂單,SQL語句可以這樣寫:SELECT o.oid,o.moneyreceipt,o.moneyget,o.thecurrency,o.status FROM qorder o WHERE o.status = 'cancel'
SQL語句能查詢出正確的數(shù)據(jù),但是當我們想查詢狀態(tài)為非cancel的訂單時,可能會出麻煩, 因為status字段沒 有設(shè)置NOT NULL,所以大部分訂單的status值都是NULL,這樣的話,用'<>'查詢出來的數(shù)據(jù)不正確,只有status除了cancel之外的非空數(shù)據(jù)查詢出來了,而為NULL的沒有查詢出來。SELECT o.oid,o.moneyreceipt,o.moneyget,o.thecurrency,o.status FROM qorder o WHERE o.status <>'cancel'原 因:NULL值操作
NULL值可能令人感到奇怪直到你習慣它。概念上,NULL意味著“沒有值”或“未知值”,且它被看作與眾不同的值。為了測試NULL,你不能使用算術(shù)比較 操作符例如=、<或!=。為了說明它,試試下列查詢:mysql> SELECT 1 = NULL, 1 <> NULL, 1 < NULL, 1 > NULL;
+----------+-----------+----------+----------+
| 1 = NULL | 1 <> NULL | 1 < NULL | 1 > NULL |
+----------+-----------+----------+----------+
| NULL | NULL | NULL | NULL |
+----------+-----------+----------+----------+
很 顯然你不能通過這些比較得到有意義的結(jié)果。相反使用IS NULL和IS NOT NULL操作符:mysql> SELECT 1 IS NULL, 1 IS NOT NULL;
+-----------+---------------+
| 1 IS NULL | 1 IS NOT NULL |
+-----------+---------------+
| 0 | 1 |
+-----------+---------------+
請注意在MySQL中,0或 NULL意味著假,而其它值意味著真。布爾運算的默認真值是1。根據(jù)以上的NULL值操作結(jié)果,最終使用此種方式解決:SELECT o.oid,o.moneyreceipt,o.moneyget,o.thecurrency,o.status FROM qorder o WHERE IFNULL(o.status,'pending') <>'cancel'學習:IFNULL(expr1,expr2)
如果expr1不是NULL,IFNULL()返回expr1,否則它返回expr2。IFNULL()返回一個數(shù)字或字符串值,取決于它被使 用的上下文環(huán)境。
mysql> select IFNULL(1,0); ->1
mysql> select IFNULL(0,10); ->0
mysql> select IFNULL(1/0,10); ->10.0000
mysql> select IFNULL(1/0,'yes'); ->'yes'IF(expr1,expr2,expr3)如果expr1是TRUE(expr1<>0且expr1<>NULL),那么IF()返回 expr2,否則它返回expr3。IF()返回一個數(shù)字或字符串值,取決于它被使用的上下文。
mysql> select IF(1>2,2,3); -> 3
mysql> select IF(1<2,'yes','no'); -> 'yes'
(1) CASE value WHEN [compare-value] THEN result [WHEN [compare-value] THEN result ...] [ELSE result] END //這個我還沒想到咋用,知道的可以留言交流,
(2) CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END //這個面試時被人問到了,可以用作條件判斷
第(1)個返回 result,其中value=compare-value。第(2)個中如果第一個條件為真,返回result。如果沒有匹配的result值,那么結(jié) 果在ELSE后的result被返回。如果沒有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
上面的例子本人在mysql5.2.6上測試通過=====================================================================================PS:以上是轉(zhuǎn)載的內(nèi)容,覺得很不錯就轉(zhuǎn)過來了,其中的CASE...WHEN...THEN、IF、IFNULL都是常用到的函數(shù)eg:SELECT id,username,CASE gender WHEN 1 THEN "男" WHEN 2 THEN "女" END FROM t_people; SELECT b.id,b.book_name,CASE b.type WHEN 1 THEN "計算機" WHEN 2 THEN "會計" ELSE "其它" END FROM book b;
我們知道查詢狀態(tài)為cancel的訂單,SQL語句可以這樣寫:SELECT o.oid,o.moneyreceipt,o.moneyget,o.thecurrency,o.status FROM qorder o WHERE o.status = 'cancel'
SQL語句能查詢出正確的數(shù)據(jù),但是當我們想查詢狀態(tài)為非cancel的訂單時,可能會出麻煩, 因為status字段沒 有設(shè)置NOT NULL,所以大部分訂單的status值都是NULL,這樣的話,用'<>'查詢出來的數(shù)據(jù)不正確,只有status除了cancel之外的非空數(shù)據(jù)查詢出來了,而為NULL的沒有查詢出來。SELECT o.oid,o.moneyreceipt,o.moneyget,o.thecurrency,o.status FROM qorder o WHERE o.status <>'cancel'原 因:NULL值操作
NULL值可能令人感到奇怪直到你習慣它。概念上,NULL意味著“沒有值”或“未知值”,且它被看作與眾不同的值。為了測試NULL,你不能使用算術(shù)比較 操作符例如=、<或!=。為了說明它,試試下列查詢:mysql> SELECT 1 = NULL, 1 <> NULL, 1 < NULL, 1 > NULL;
+----------+-----------+----------+----------+
| 1 = NULL | 1 <> NULL | 1 < NULL | 1 > NULL |
+----------+-----------+----------+----------+
| NULL | NULL | NULL | NULL |
+----------+-----------+----------+----------+
很 顯然你不能通過這些比較得到有意義的結(jié)果。相反使用IS NULL和IS NOT NULL操作符:mysql> SELECT 1 IS NULL, 1 IS NOT NULL;
+-----------+---------------+
| 1 IS NULL | 1 IS NOT NULL |
+-----------+---------------+
| 0 | 1 |
+-----------+---------------+
請注意在MySQL中,0或 NULL意味著假,而其它值意味著真。布爾運算的默認真值是1。根據(jù)以上的NULL值操作結(jié)果,最終使用此種方式解決:SELECT o.oid,o.moneyreceipt,o.moneyget,o.thecurrency,o.status FROM qorder o WHERE IFNULL(o.status,'pending') <>'cancel'學習:IFNULL(expr1,expr2)
如果expr1不是NULL,IFNULL()返回expr1,否則它返回expr2。IFNULL()返回一個數(shù)字或字符串值,取決于它被使 用的上下文環(huán)境。
復(fù)制代碼 代碼如下:
mysql> select IFNULL(1,0); ->1
mysql> select IFNULL(0,10); ->0
mysql> select IFNULL(1/0,10); ->10.0000
mysql> select IFNULL(1/0,'yes'); ->'yes'IF(expr1,expr2,expr3)如果expr1是TRUE(expr1<>0且expr1<>NULL),那么IF()返回 expr2,否則它返回expr3。IF()返回一個數(shù)字或字符串值,取決于它被使用的上下文。
mysql> select IF(1>2,2,3); -> 3
mysql> select IF(1<2,'yes','no'); -> 'yes'
(1) CASE value WHEN [compare-value] THEN result [WHEN [compare-value] THEN result ...] [ELSE result] END //這個我還沒想到咋用,知道的可以留言交流,
(2) CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END //這個面試時被人問到了,可以用作條件判斷
第(1)個返回 result,其中value=compare-value。第(2)個中如果第一個條件為真,返回result。如果沒有匹配的result值,那么結(jié) 果在ELSE后的result被返回。如果沒有ELSE部分,那么NULL被返回。
復(fù)制代碼 代碼如下:
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
上面的例子本人在mysql5.2.6上測試通過=====================================================================================PS:以上是轉(zhuǎn)載的內(nèi)容,覺得很不錯就轉(zhuǎn)過來了,其中的CASE...WHEN...THEN、IF、IFNULL都是常用到的函數(shù)eg:SELECT id,username,CASE gender WHEN 1 THEN "男" WHEN 2 THEN "女" END FROM t_people; SELECT b.id,b.book_name,CASE b.type WHEN 1 THEN "計算機" WHEN 2 THEN "會計" ELSE "其它" END FROM book b;
相關(guān)文章
MySQL中出現(xiàn)lock?wait?timeout?exceeded問題及解決
這篇文章主要介紹了MySQL中出現(xiàn)lock?wait?timeout?exceeded問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08在CentOS上MySQL數(shù)據(jù)庫服務(wù)器配置方法
最近工作中經(jīng)常需要使用到MySQL,有時候在WINXP,有時候在Linux中,而這次,需要在CentOS中配置一下,還需要用到phpmyadmin, 在網(wǎng)上搜了不少的資料。2010-04-04mysql 加了 skip-name-resolve不能鏈接數(shù)據(jù)庫問題的解決方法
這篇文章主要介紹了mysql 加了 skip-name-resolve不能鏈接數(shù)據(jù)庫問題的解決方法,需要的朋友可以參考下2016-04-04MySQL如何統(tǒng)計一個數(shù)據(jù)庫所有表的數(shù)據(jù)量
最近在做統(tǒng)計想查找一個數(shù)據(jù)庫里基本所有的表數(shù)據(jù)量,下面這篇文章主要給大家介紹了關(guān)于MySQL如何統(tǒng)計一個數(shù)據(jù)庫所有表的數(shù)據(jù)量的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下2022-04-04window10中mysql8.0修改端口port不生效的解決方法
mysql配置文件默認位置,端口號等信息需要在my.ini文件中修改,若修改安裝位置的my-default文件文件或新建my.ini文件是不生效的,本文主要介紹了window10中mysql8.0修改端口port不生效的解決方法,感興趣的可以了解一下2023-11-11MySQL數(shù)據(jù)時區(qū)問題以及datetime和timestamp類型存儲的差異
這篇文章主要介紹了MySQL數(shù)據(jù)時區(qū)問題以及datetime和timestamp類型存儲的差異,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11