非常有用的MySQL控制流程函式

2021-05-23 18:21:43 字數 3345 閱讀 8500

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

例如: 

drop

table if exists `test`;  

create

table `test` (  

`id` int(11) not

null auto_increment,  

`dataclass` varchar(25) collate gbk_bin default

null,  

`class` varchar(25) collate gbk_bin default

null,  

`count` varchar(25) collate gbk_bin default

null,  

primary

key (`id`)  

) engine=myisam auto_increment=5 default charset=gbk collate=gbk_bin;  

insert

into test values ('1', '2004-02', 'au', '32');  

insert

into test values ('2', '2004-02', 'vaio', '56');  

insert

into test values ('3', '2004-03', 'au', '38');  

insert

into test values ('4', '2004-03', 'pb', '55'); 

要檢索test中的資料,當條件 id 為0時查詢出所有的資料,當 id不為0時查詢出 對應的資料。

用mysql的控制流函式可以很簡單的實現.

控制流函式詳解:

在第乙個方案的返回結果中, 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表示式的預設返回值型別是任何返回值的相容集合型別,但具體情況視其所在語境而定。如果用在字串語境中,則返回結果味字串。如果用在數字語境中,則返回結果為十進位制值、實值或整數值。 

如果 expr1 是true (expr1

<> 0 and expr1

<> null),則 if()的返回值為expr2; 否則返回值則為 expr3。if() 的返回值為數字值或字串值,具體情況視其所在語境而定。

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 都是字串,且其中任何乙個字串區分大小寫,則返回結果是區分大小寫。

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

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)。

如果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 。

非常有用的CChineseCode類

class cchinesecode void cchinesecode utf 8tounicode wchar t pout,char ptext void cchinesecode unicodetoutf 8 char pout,wchar t ptext void cchinesecode...

別人的隨筆(非常有用)

1 xp系統修改許可權防止病毒或木馬等破壞系統,cmd下,cacls c windows system32 g hqw20 r 思是給hqw20這個使用者只能讀取system32目錄,但不能進行修改或寫入 恢復方法 c cacls c windows system32 g hqw20 f 2 用mi...

mysql的sql執行計畫詳解(非常有用)

引言 實際專案開發中,由於我們不知道實際查詢的時候資料庫裡發生了什麼事情,資料庫軟體是怎樣掃瞄表 怎樣使用索引的,因此,我們能感知到的就只有 sql語句執行的時間,在資料規模不大時,查詢是瞬間的,因此,在寫sql語句的時候就很少考慮到效能的問題。但是當資料規模增大,如千萬 億的時候,我們運 行同樣的...