MySQL tem um
IF()
função que fornece uma maneira conveniente de realizar uma operação simples “IF/ELSE”. Funciona de maneira semelhante a um
IF
básico /ELSE
declaração, na medida em que nos permite verificar uma condição e retornar um resultado diferente dependendo se é verdadeiro ou não. Mais especificamente, se o primeiro argumento para
IF()
for true, o segundo argumento será retornado. Se não for verdade, o terceiro argumento é retornado. Sintaxe
IF(expr1,expr2,expr3)
Se
expr1
é TRUE
(expr1
<> 0
e expr1
NÃO É NULO
), IF()
retorna expr2
. Caso contrário, ele retornará expr3
. Tipo de retorno
- Se
expr2
ouexpr3
produzir uma string, o resultado é uma string. Seexpr2
eexpr3
são ambas strings e qualquer string diferencia maiúsculas de minúsculas, o resultado diferencia maiúsculas de minúsculas. - Se
expr2
ouexpr3
produzir um valor de ponto flutuante, o resultado será um valor de ponto flutuante. - Se
expr2
ouexpr3
produzir um inteiro, o resultado será um inteiro.
Exemplo
Aqui está um exemplo simples para demonstrar como funciona:
SELECT IF( 1 > 2, 'Yes', 'No' );
Resultado:
No
Aqui, verificamos se 1 é maior que 2. Não é, então o terceiro argumento foi retornado.
Aqui está o que acontece quando a primeira expressão é verdadeira:
SELECT IF( 2 > 1, 'Yes', 'No' );
Resultado:
Yes
Exemplo de banco de dados
Aqui está um exemplo que usa o
IF()
função ao consultar um banco de dados:SELECT
Name,
Population,
IF( Population > 10000000, 'Big', 'Small' ) AS "Big/Small"
FROM Country
ORDER BY Name ASC
LIMIT 10;
Resultado:
+---------------------+------------+-----------+ | 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 | +---------------------+------------+-----------+
Aninhado IF()
Funções
É possível aninhar
IF()
funções para fornecer mais do que um resultado binário. Por exemplo:
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;
Resultado:
+--------------+------------+------------+ | 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 | +--------------+------------+------------+
Nulos e Zeros
Se a primeira expressão for
NULL
ou 0
, então é falso e o segundo valor é retornado:SELECT
IF( 1, 'True', 'False' ) AS "1",
IF( null, 'True', 'False' ) AS "Null",
IF( 0, 'True', 'False' ) AS "Zero";
Resultado:
+------+-------+-------+ | 1 | Null | Zero | +------+-------+-------+ | True | False | False | +------+-------+-------+
Aqui, a primeira coluna é verdadeira porque resolve para 1. As outras duas colunas retornam o segundo argumento, porque o primeiro argumento foi
null
e 0
respectivamente. Aqui está um exemplo de banco de dados:
SELECT
Name,
GNPOld,
IF( GNPOld, GNPOld, 'None' )
FROM Country
ORDER BY Name ASC
LIMIT 10;
Resultado:
+---------------------+-----------+------------------------------+ | 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 | +---------------------+-----------+------------------------------+
Embora neste caso o mesmo resultado pudesse ser alcançado com um pouco menos de código usando o
IFNULL()
função ou mesmo a função COALESCE()
função.