Óðîê 6.5: Ôóíêöèè âåòâëåíèÿ â MySQL
Ãëàâíàÿ Ñòðàíèöà » Êíèãè ïî PHP » MySQL óðîêè äëÿ íà÷èíàþùèõ ñ íóëÿ » Ôóíêöèè âåòâëåíèÿ â MySQL
Èíîãäà íàäî, ÷òîáû çàïðîñ âåë ñåáÿ ïî-ðàçíîìó â ðàçëè÷íûõ ñèòóàöèÿõ. Äëÿ ýòîãî ñóùåñòâóþò ñïîñîáû ðàçâåòâèò åãî íà ðàçíûå íàïðàâëåíèÿ, â çàâèñèìîñòè îò ðàçëè÷íûõ âíåøíèõ óñëîâèé âûïîëíåíèÿ.
IFNULL(expr1, åõðr2)
Åñëè 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"
NULLIF(expr1, expr2)
Åñëè expr1=expr2, âåðíåò NULL, èíà÷å âîçâðàùàåò expr1. Ýòî ðàáîòàåò òàê-æå, êàê CASE WHEN õ=ó THEN NULL ELSE x END (ðàññìîòðåíî ÷óòü íèæå):
mysql> select NULLIF(1,1);
-> NULL
mysql> select NULLIF(1,2);
-> 1
Îáðàòèòå âíèìàíèå, ÷òî expr1 áóäåò îöåíåí äâàæäû â MySQL, åñëè ïàðàìåòðû ðàâíû.
IF(expr1, expr2, åõðrÇ)
Åñëè expr1 ðàâíî TRUE (expr1 <> 0 è exprl <> NULL), òî IF() âåðíåò åõðr2, èíà÷å âåðíåò åõðrÇ. IF() âîçâðàùàåò ÷èñëîâîå èëè ñòðîêîâîå çíà÷åíèå â çàâèñèìîñòè îò êîíòåêñòà, â êîòîðîì ýòî èñïîëüçóåòñÿ:
mysql> select IF(1>2,2,3);
-> 3
mysql> select IF(1<2,'yes','no');
-> “yea"
mysql> select IF(strcmp("test",'test1'),'no','yes');
-> "no"
Âûðàæåíèå 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 () (êîòîðûé ìîæåò èìåòü çíà÷åíèå, êîãäà ýòî çíà÷åíèå áóäåò ñîõðàíåíî âî âðåìåííîé òàáëèöå) âû÷èñëåí â MySQL 3.23 ñëåäóþùèì îáðàçîì (òàáë. 6.1):
Òàáëèöà 6.1. Òèïû âîçâðàòà äëÿ IF()
| Âûðàæåíèå | Âîçâðàùàåìîå çíà÷åíèå |
| åõðr2 èëè åõðrÇ âîçâðàùàåò ñòðîêó | Ñòðîêà |
| åõðr2 èëè åõðrÇ âîçâðàùàåò çíà÷åíèå ñ ïëàâàþùåé çàïÿòîé | ×èñëî ñ ïëàâàþùåé çàïÿòîé |
| åõðr2 èëè åõðrÇ âîçâðàùàåò öåëîå ÷èñëî | Öåëîå ÷èñëî |
| åõðr2 èëè åõðrÇ âîçâðàùàåò ñòðîêó | Ñòðîêà |
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.
Ýòî î÷åíü èíòåðåñíûé è ñëîæíûé îïåðàòîð. Îí ïîçâîëÿåò íå ïðîñòî âûáðàòü îäèí èç äâóõ âàðèàíòîâ âûïîëíåíèÿ, à ðàçäåëèòü çàïðîñ íà ñòîëüêî âàðèàíòîâ, íà ñêîëüêî íóæíî. Õîòü íà ñòî.
Ïåðâàÿ âåðñèÿ âîçâðàùàåò result, ãäå 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 «Â» when «à» then 1 when «b» then 2 END;
-> NULL
Òèï çíà÷åíèÿ âîçâðàòà (INTEGER, DOUBLE èëè STRING) òàêîé æå, êàê è òèï ïåðâîãî âîçâðàùåííîãî çíà÷åíèÿ (âûðàæåíèå ïîñëå ïåðâîãî THEN).



