Kvalitetsgranskning av databasmodell, SQL kod, databassäkerhet, backup/restore rutiner, utvecklingsrutiner och driftrutiner. Denna granskning syftar till…
Som de allra flesta vet är NULL i en databas är odefinierad vilket innebär att jämförelser med NULL alltid resulterar i FALSE såvida man inte använder IS NULL.
Enkel förklarat kan man säga att NULL är inte lika med NULL, men NULL är inte heller skillt ifrån NULL. Detta kan enkelt bevisas med följande kod: SELECT * FROM sys.[databases] AS D WHERE NULL=NULL OR NULL<>NULL Denna kod resulterar som väntat i ett tomt resultatset. Att NULL är odefinierad måste man tänka på i många samanhang, ett av dessa är exempelvis i CASE satser. Vad blir resultatet av nedanstående kod? SELECT CASE column1 WHEN NULL THEN ‘Is Null’ ELSE column1 END FROM ( SELECT NULL AS column1 ) TMP Om ni gissade att resultatet skulle bli “Is Null” så får ni tänka om. I WHEN satsen kontrolleras column1=NULL vilket blir falskt och därför så blir resultatet att värdet av column1 visas tack vare ELSE satsen. Okej, vad ska man göra då? Skriva in IS NULL i WHEN satsen? Nej, då får du syntax fel. Om du däremot skriver om CASE satsen lite så får du önskad effekt. SELECT CASE –column1 är nu flyttat till WHEN satsen. WHEN column1 IS NULL THEN ‘Is Null’ ELSE column1 END FROM ( SELECT NULL AS column1 ) TMP
Glasklart? Bra! Har du några funderingar om SQL Server eller databasdesign så är du välkommen att kontakta någon av våra specialliserade SQL server konsulter.