MySQL има IF()
функция, която осигурява удобен начин за извършване на проста операция „IF/ELSE“.
Работи подобно на основния IF
/ELSE
изявление, тъй като ни позволява да проверим за условие и да върнем различен резултат в зависимост от това дали е вярно или не.
По-конкретно, ако първият аргумент на IF()
функцията е вярна, вторият аргумент се връща. Ако не е вярно, се връща третият аргумент.
Синтаксис
IF(expr1,expr2,expr3)
Ако expr1
е TRUE
(
и expr1
<> 0
), expr1
НЕ Е NULLIF()
връща expr2
. В противен случай връща expr3
.
Тип връщане
- Ако
expr2
илиexpr3
произведете низ, резултатът е низ. Акоexpr2
иexpr3
са и двата низа и всеки от низовете е чувствителен към малки и големи букви, резултатът е чувствителен към малки и големи. - Ако
expr2
илиexpr3
произведете стойност с плаваща запетая, резултатът е стойност с плаваща запетая. - Ако
expr2
илиexpr3
произведете цяло число, резултатът е цяло число.
Пример
Ето един прост пример, за да демонстрирате как работи:
SELECT IF( 1 > 2, 'Yes', 'No' );
Резултат:
No
Тук проверихме дали 1 е по-голямо от 2 или не. Не е и така беше върнат третият аргумент.
Ето какво се случва, когато първият израз е верен:
SELECT IF( 2 > 1, 'Yes', 'No' );
Резултат:
Yes
Пример за база данни
Ето пример, който използва IF()
функция при запитване към база данни:
SELECT
Name,
Population,
IF( Population > 10000000, 'Big', 'Small' ) AS "Big/Small"
FROM Country
ORDER BY Name ASC
LIMIT 10;
Резултат:
+---------------------+------------+-----------+ | Name | Population | Big/Small | +---------------------+------------+-----------+ | Afghanistan | 22720000 | Big | | Albania | 3401200 | Small | | Algeria | 31471000 | Big | | American Samoa | 68000 | Small | | Andorra | 78000 | Small | | Angola | 12878000 | Big | | Anguilla | 8000 | Small | | Antarctica | 0 | Small | | Antigua and Barbuda | 68000 | Small | | Argentina | 37032000 | Big | +---------------------+------------+-----------+
Вложено IF()
Функции
Възможно е да се вложи IF()
функции, за да се осигури повече от двоичен резултат.
Например:
SELECT
Name,
Population,
IF(
Population > 10000000,
IF( Population > 100000000, 'REALLY Big', 'Big' ),
'Small'
) AS "Size"
FROM Country
WHERE Region = 'Southern and Central Asia'
ORDER BY Population DESC;
Резултат:
+--------------+------------+------------+ | Name | Population | Size | +--------------+------------+------------+ | India | 1013662000 | REALLY Big | | Pakistan | 156483000 | REALLY Big | | Bangladesh | 129155000 | REALLY Big | | Iran | 67702000 | Big | | Uzbekistan | 24318000 | Big | | Nepal | 23930000 | Big | | Afghanistan | 22720000 | Big | | Sri Lanka | 18827000 | Big | | Kazakstan | 16223000 | Big | | Tajikistan | 6188000 | Small | | Kyrgyzstan | 4699000 | Small | | Turkmenistan | 4459000 | Small | | Bhutan | 2124000 | Small | | Maldives | 286000 | Small | +--------------+------------+------------+
Нули и нули
Ако първият израз е или NULL
или 0
, тогава е false и се връща втората стойност:
SELECT
IF( 1, 'True', 'False' ) AS "1",
IF( null, 'True', 'False' ) AS "Null",
IF( 0, 'True', 'False' ) AS "Zero";
Резултат:
+------+-------+-------+ | 1 | Null | Zero | +------+-------+-------+ | True | False | False | +------+-------+-------+
Тук първата колона е вярна, защото се разрешава до 1. Другите две колони връщат втория аргумент, тъй като първият им аргумент е null
и 0
съответно.
Ето пример за база данни:
SELECT
Name,
GNPOld,
IF( GNPOld, GNPOld, 'None' )
FROM Country
ORDER BY Name ASC
LIMIT 10;
Резултат:
+---------------------+-----------+------------------------------+ | Name | GNPOld | IF( GNPOld, GNPOld, 'None' ) | +---------------------+-----------+------------------------------+ | Afghanistan | NULL | None | | Albania | 2500.00 | 2500.00 | | Algeria | 46966.00 | 46966.00 | | American Samoa | NULL | None | | Andorra | NULL | None | | Angola | 7984.00 | 7984.00 | | Anguilla | NULL | None | | Antarctica | NULL | None | | Antigua and Barbuda | 584.00 | 584.00 | | Argentina | 323310.00 | 323310.00 | +---------------------+-----------+------------------------------+
Въпреки че в този случай същият резултат би могъл да се постигне с малко по-малко код с помощта на IFNULL()
функция или дори COALESCE()
функция.