Avatar billede Kodelærlingen Juniormester
17. januar 2017 - 15:05 Der er 11 kommentarer

SQL function - hjælp til operatorer og værdien NULL

Hej
Jeg er lige startet på, at lave nogle SQL functions. Det går fint med at sætte en parametre lig med en værdi. Kan man i sine parametre angive om værdien skal være lig med, større end, mindre end eller forskellig fra?

En anden udfordring er, at en af mine kolonner indeholde NULL. Hvordan kan sætte jeg f.eks. parametre lig NULL? Og hvis jeg vil have vist alle poster som ikke er er NULL, hvad gør jeg så?
Avatar billede terry Ekspert
17. januar 2017 - 15:21 #1
Avatar billede Kodelærlingen Juniormester
17. januar 2017 - 15:32 #2
Der er mig som ikke var helt præcis - sorry. Det jeg skal have hjælp til er sql user defined function.
Avatar billede arne_v Ekspert
17. januar 2017 - 15:45 #3
Hvad er problemet med at bruge NULL i en parameter?
Avatar billede Kodelærlingen Juniormester
17. januar 2017 - 20:11 #4
Jeg har en kolonne som hedder sletningsÅrsag. Er kunden slettet indsættes en tal for den relevante sletningsårsag (1-5). Er kunden ikke slettet, så er feltet af gode årsager NULL.

Jeg vil starte med at lave min SQL-kode sådan (se nedestående kode) og så derefter lave min user defined function. Hvis jeg sætter "SET @sletningsÅrsag = 1" så får jeg alle de kunder, hvor sletningsårsagen er 1. Jeg kunne godt tænke mig, at forespørgslen viste mig alle de kunder, hvor sletningsÅrsag er = NULL. Det virker bare ikke - se igen nedestående kode. Derudover kunne jeg også godt tænke mig, at få vist alle kunder, hvor sletningsÅrsag er forskellig fra NULL. Hvordan går jeg det??? Er der noget specielt ved NULL, som man skal tage højde for?

DECLARE @sletningsÅrsag INT
SET @sletningsÅrsag = NULL

SELECT *

from kunde k
WHERE k.SletningsÅrsag=@sletningsÅrsag
Avatar billede arne_v Ekspert
17. januar 2017 - 20:25 #5
Ja.

NULL=NULL er false.

:-)
Avatar billede arne_v Ekspert
17. januar 2017 - 20:26 #6
Maaske:

SELECT *
from kunde k
WHERE ISNULL(k.SletningsÅrsag,-1)=ISNULL(@sletningsÅrsag ,-1)
Avatar billede arne_v Ekspert
17. januar 2017 - 20:28 #7
Eller:

SELECT *
from kunde k
WHERE (k.SletningsÅrsag IS NULL AND @sletningsÅrsag IS NULL) OR (k.SletningsÅrsag=@sletningsÅrsag )
Avatar billede Kodelærlingen Juniormester
25. januar 2017 - 12:35 #8
Jeg vil gøre mine sql-script mere fleksibel, og vil ikke tilpasse f.eks. et kunde script til forskellige formål, men vil have et kunde script, som jeg kan lave en forespørgsel ud fra forskellige parametre.

Det må vel kunne lade sige gøre, at lave en forespørgsel på de værdier som findes i kolonnerne? Her tænker jeg f.eks. på kolonnen sletningsÅrsag som har værdierne NULL, 1, 2, 3, 4 og 5.

Skal @sletningsÅrsag så være INT, hvis "værdien" er skal kunne være NULL?
DECLARE @sletningsÅrsag INT
SET @sletningsÅrsag = NULL

Et er at sætte en parametre lig en værdi, men jeg kunne også godt tænke mig, at kunne forespørgsler med, hvor parameteren er <>, >, >=, < eller <=. Hvordan laver jeg et sådanne script/function?
Avatar billede arne_v Ekspert
28. januar 2017 - 04:06 #9
Maaske:

ISNULL(felt,'her havde vi et NULL')=ISNULL(@param,'her havde vi et NULL')
Avatar billede arne_v Ekspert
28. januar 2017 - 04:06 #10
eller -1 hvis integer
Avatar billede kjulius Novice
14. marts 2017 - 19:59 #11
Generelt skal du være lidt varsom med at lave en enkelt forespørgsel baseret på alle mulige parametre. Det kan ofte bedre betale sig at dele det op i flere bidder. Det giver som regel bedre eksekveringsplaner (= hurtigere udførsel).

At bruge funktioner i selektionskriterier skal man være varsom med, da det gør, at SQL serveren ikke kan bruge evt. indexer på feltet.

Bemærk også, at null er en "not assigned" indikator og ikke en værdi. Derfor kan du ikke bruge en Null = Null eller Null <> Null som selektionskriterie. Man kan teste det via WHERE xxx IS NULL og WHERE xxx IS NOT NULL. Som Arne skriver, kan man bruge ISNULL til at erstatte en Null indikator med en værdi og bruge denne til at teste på.

Men funktioner i selektionskriterier ødelægger performance, da alle rækker jo skal behandles af den brugte funktion.

Det vil derfor ofte være bedre og mere effektivt (især ved store tabeller) at bruge en IF sætning til at udføre forskellige forespørgsler:
IF @minParamter1 IS NULL
    SELECT mitFelt1, mitFelt2
    FROM minTabel
    WHERE mitFelt3 IS NULL AND mitFelt2=3
ELSE
    SELECT mitFelt1, mitFelt2
    FROM minTabel
    WHERE mitFelt3 IS NOT NULL AND mitFelt2=3

Dermed er SQL Server i stand til at lave optimale forespørgsler, der bruger indexer korrekt.

Det vil altid være en afvejning af flere faktorer, der afgør hvilken vej der er den bedste.

Du kan måske også få lidt inspiration ved at kigge på denne artikel:
http://www.sqlservercentral.com/blogs/sqlstudies/2017/02/27/queries-with-optional-parameters/
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester