[sql] Coalesce

Pagina: 1
Acties:

  • Tinuske
  • Registratie: September 2002
  • Laatst online: 08-02 20:43
Ik heb de volgende stored procedure die ik gebruik voor een zoekfunctie :

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE Procedure dbo.calSelectZoek
@bedrijfID int,
@statusID int,

AS
    SELECT calMelding.MeldingID,calStatus.Naam,calMelding.Omschrijving
    FROM    calMelding,calStatus(NOLOCK)
    Where calMelding.StatusID = calStatus.StatusID
and calMelding.BedrijfID = COALESCE(@bedrijfID,calMelding.BedrijfID)
and calMelding.statusID = COALESCE(@statusID,calMelding.statusID)

return(0)
GO

Zoals je kunt zien is het mogelijk om te zoeken op bedrijf en status. Nu kan het zijn dat bedrijfID de waarde <null> heeft in de tabel. Als dat zo is , krijg je deze niet terug als resultaat. Dat heeft denk ik te maken met Coalesce. Ik wil dat ook bedrijven met een null waarde worden teruggeven . Wat moet ik hiervoor veranderen in deze sql procedure ?

Alvast bedankt!

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
ISNULL(BedrijfId,'*') = COALESCE(@BedrijfId, BedrijfId, '*')

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Tinuske
  • Registratie: September 2002
  • Laatst online: 08-02 20:43
Bedankt, het werkt prima!

Ik vraag me wel af wat nu de performance zal zijn van mijn nieuwe stored procedure ? Want nu wordt namelijk elke keer gekeken of de waarde van bedrijfid null is.
Is dit nog wel altijd sneller dan string concatenatie?

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Een geparameteriseerde query opbouwen in de client (bijv. .aspx pagina) zal in de meeste gevallen beter werken. Voor een intressante discussie over performance van ad-hoc queries is dit een leuk artikel

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Tinuske
  • Registratie: September 2002
  • Laatst online: 08-02 20:43
Een andere vraag over coaleasce , voor een zoekfunctie wil ik iets selecteren waarbij de risicoscore groter is dan de ingevoerde waarde of null is.

Met
code:
1
ISNULL(tblRisicoObjectProces.RisicoScore,'-1') >= COALESCE(@dblRisicoScore,tblRisicoObjectProces.RisicoScore,'-1')

krijg ik alle waardes terug die gelijk zijn die null , groter OF GELIJK aan zijn
en dat gelijk aan wil ik niet hebben.
Ik zou natuurlijk de ingevoerde waarde kunnen ophogen met 1 en dan de sql kunnen uitvoeren, maar dat vind ik een smerige oplossing. Iemand een idee hoe ik dit netjes oplos ?

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Kun je het niet gewoon met een OR doen?
code:
1
2
3
4
(
   ISNULL(tblRisicoObjectProces.RisicoScore,'-1') > 
   COALESCE(@dblRisicoScore,tblRisicoObjectProces.RisicoScore,'-1')
) OR tblRisicoObjectProces.RisicoScore IS NULL

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Tinuske
  • Registratie: September 2002
  • Laatst online: 08-02 20:43
Mischien was mijn vraagstelling niet helemaal duidelijk.

Ik wil als er een waarde is ingevuld, alles selecteren waarbij de risicoscore groter is dan de ingevoerde waarde
Ik wil dan geen waardes terug waarbij de risicoscore Null is.
Als ik geen waarde invul, wil ik alles selecteren, ook diegene waarbij de risicoscore NULL is.
Een OR werkt in dit geval dus niet.
Een andere oplossing misschien ?

p.s. erg leuk artikel, heel wat voor- en tegenstanders :)

  • Tinuske
  • Registratie: September 2002
  • Laatst online: 08-02 20:43
Niemand ?

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Ik kan me dit nog voorstellen:
code:
1
2
ISNULL(tblRisicoObjectProces.RisicoScore,'-1') > 
    COALESCE(@dblRisicoScore,tblRisicoObjectProces.RisicoScore -1,'-1')

Oops! Google Chrome could not find www.rijks%20museum.nl

Pagina: 1