MySQL har en IF()
funktion som ger ett bekvämt sätt att utföra en enkel "OM/ELSE"-operation.
Det fungerar på samma sätt som en grundläggande IF
/ELSE
uttalande, genom att det tillåter oss att kontrollera ett tillstånd och returnera ett annat resultat beroende på om det är sant eller inte.
Mer specifikt, om det första argumentet till IF()
funktionen är sann, det andra argumentet returneras. Om det inte är sant, returneras det tredje argumentet.
Syntax
IF(expr1,expr2,expr3)
Om expr1
är TRUE
(
och expr1
<> 0
), expr1
ÄR INTE NULLIF()
returnerar expr2
. Annars returnerar den expr3
.
Returtyp
- Om
expr2
ellerexpr3
producera en sträng, blir resultatet en sträng. Omexpr2
ochexpr3
är båda strängar och båda strängarna är skiftlägeskänsliga, resultatet är skiftlägeskänsligt. - Om
expr2
ellerexpr3
producerar ett flyttal, blir resultatet ett flyttal. - Om
expr2
ellerexpr3
producera ett heltal, blir resultatet ett heltal.
Exempel
Här är ett enkelt exempel för att visa hur det fungerar:
SELECT IF( 1 > 2, 'Yes', 'No' );
Resultat:
No
Här kontrollerade vi om 1 är större än 2 eller inte. Det är det inte, och därför returnerades det tredje argumentet.
Så här händer när det första uttrycket är sant:
SELECT IF( 2 > 1, 'Yes', 'No' );
Resultat:
Yes
Databasexempel
Här är ett exempel som använder IF()
funktion när du frågar efter en databas:
SELECT
Name,
Population,
IF( Population > 10000000, 'Big', 'Small' ) AS "Big/Small"
FROM Country
ORDER BY Name ASC
LIMIT 10;
Resultat:
+---------------------+------------+-----------+ | 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 | +---------------------+------------+-----------+
Inkapslade IF()
Funktioner
Det är möjligt att kapsla IF()
fungerar för att ge mer än ett binärt resultat.
Till exempel:
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;
Resultat:
+--------------+------------+------------+ | 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 | +--------------+------------+------------+
Nollor och nollor
Om det första uttrycket är antingen NULL
eller 0
, då är det falskt och det andra värdet returneras:
SELECT
IF( 1, 'True', 'False' ) AS "1",
IF( null, 'True', 'False' ) AS "Null",
IF( 0, 'True', 'False' ) AS "Zero";
Resultat:
+------+-------+-------+ | 1 | Null | Zero | +------+-------+-------+ | True | False | False | +------+-------+-------+
Här är den första kolumnen sann eftersom den löser sig till 1. De andra två kolumnerna returnerar det andra argumentet, eftersom deras första argument var null
och 0
respektive.
Här är ett databasexempel:
SELECT
Name,
GNPOld,
IF( GNPOld, GNPOld, 'None' )
FROM Country
ORDER BY Name ASC
LIMIT 10;
Resultat:
+---------------------+-----------+------------------------------+ | 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 | +---------------------+-----------+------------------------------+
Även om i det här fallet samma resultat kunde ha uppnåtts med lite mindre kod med IFNULL()
funktion eller till och med COALESCE()
funktion.