SQL Server - Hantera NULL-värden vid sortering

När du arbetar med NULL-värden är det viktigt att du hanterar NULL-poster i din databas. Detta exempel går igenom och förklarar hur man sorterar och separerar NULL- och icke-NULL-värden. Detta exempel ska fungera med alla databastyper inklusive MySQL, MS SQL och postgreSQL.

Låt oss börja med ett exempel.

Tänk på en anställd tabell.

eid ename lönekommission ----------- -------------------- ----------- ---- ------- 100 jon 2000 NULL 101 tim 2200 NULL 102 mark 2500 NULL 103 steve 3500 NULL 104 kung 5500 0 104 avdelning 1500 300 105 adam 5500 800

Nu vill du sortera resultaten från arbetstabellen av provision kolumn. Denna kolumn är dock nullställbar så vi måste ange om NULL-värden sorterar sist eller först.

Resultatet kan innehålla NULLs sorterade antingen först eller sorterade sist.

välj * från anställningsorder av kommissionen; eid ename lönekommission ----------- -------------------- ----------- ---- ------- 100 jon 2000 NULL 101 tim 2200 NULL 102 mark 2500 NULL 103 steve 3500 NULL 104 kung 5500 0 104 varv 1500 300 105 adam 5500 800 (7 rader påverkas)
välj * från anställningsorder genom provision desc; eid ename lönekommission ----------- -------------------- ----------- ---- ------- 105 adam 5500 800 104 avdelning 1500 300 104 kung 5500 0 100 jon 2000 NULL 101 tim 2200 NULL 102 mark 2500 NULL 103 steve 3500 NULL (7 rader påverkas)
 

Ovanstående frågor sorterar resultaten för nollställbar kolumn (provision). Om du vill sortera icke-NULL-värden i stigande och nedåtgående ordning och placera NULL-värdena antingen först eller sista, kan du använda underfrågor med falluttryck.

Med ett falluttryck kan du flagga NULL-värden och icke-NULL-värden. När du är klar kan du lägga till en flaggkolumn i ordning efter klausul. Då kan du enkelt sortera non-NULLs värden i stigande / fallande ordning eller NULL värden i första eller sista positionen.

Sortera icke-NULLs värden i stigande eller nedåtgående ordning.

välj eid, ename, lön, provision från (välj *, fall då provisionen är null då 1 annat 0 slut som is_null från anställd) x order by is_null, commission; eid ename lönekommission ----------- -------------------- ----------- ---- ------- 104 kung 5500 0 104 avdelning 1500 300 105 adam 5500 800 100 jon 2000 NULL 101 tim 2200 NULL 102 mark 2500 NULL 103 steve 3500 NULL (7 rader påverkas)
 

I ovanstående fråga har vi sorterat non-NULLs i stigande ordning med NULLs äntligen.

Sortering av NULLs första och icke-NULLs i fallande ordning.

välj eid, ename, lön, kommission från (välj *, fall då provisionen är null då 1 annat 0 slut som is_null från anställd) x order by is_null desc, commission desc; eid ename lönekommission ----------- -------------------- ----------- ---- ------- 100 jon 2000 NULL 101 tim 2200 NULL 102 mark 2500 NULL 103 steve 3500 NULL 105 adam 5500 800 104 varv 1500 300 104 kung 5500 0 (7 rader påverkas)
 

Nu kan du se resultaten NULL-värden sorteras först följt av icke-NULL i nedåtgående ordning.