webForumDet fria alternativet

IF statement i Stored procedure

3 svar · 614 visningar · startad av SteveP

StevePMedlem sedan mars 2003751 inlägg
#1

Nedan är en sökningsquery.

Som det ser ut nu så söker på den % (alla specialiteter) om paramteren @VarSpeciality är tom och då dyker dubletter upp eftersom en person kan ha flera specialiteter kopplade till sig genom ett intersection table.

Jag vill enbart inkludera den FETMARKERADE delen av queryn om parametern @VarSpeciality inte är tom. Jag vill helt enkelt inte söka på specialitet om parametern är tom.

WHERE SCA.CONTACT_ID = SIEB_SWE_TST..S_CONTACT.ROW_ID AND
   SIEB_SWE_TST..S_CON_ADDR.ACTIVE_FLG = 'Y' AND
   SIEB_SWE_TST..S_CON_ADDR.X_ACTIVE_FLG = 'Y' AND						
   SIEB_SWE_TST..S_ADDR_PER.X_ACTIVE_FLG = 'Y' AND										
   SIEB_SWE_TST..S_CONTACT.SUPPRESS_EMAIL_FLG = 'N' AND					
   SIEB_SWE_TST..S_CON_ADDR.X_VERIFICATION_STAT = 'Provider-Approved' AND
   SIEB_SWE_TST..S_CONTACT.X_VERIFICATION_STAT = 'Provider-Approved' AND
   SIEB_SWE_TST..S_ADDR_PER.X_VERIFICATION_STAT = 'Provider-Approved' AND
   SIEB_SWE_TST..S_CONTACT.FST_NAME LIKE @VarFirstName 	AND
   SIEB_SWE_TST..S_CONTACT.LAST_NAME LIKE @VarLastName AND		
   [b]C_SPEC.NAME LIKE @VarSpeciality AND[/b]
   C_TYPE.NAME LIKE @VarType)
emissionMedlem sedan dec. 19996 095 inlägg
#2

Det är ingen IF, det är en OR.

(@VarSpeciality [i]är tom[/i] OR C_SPEC.NAME LIKE @VarSpeciality) AND...

Det är tänkbart att du får stödja upp det hela med en DISTINCT.

StevePMedlem sedan mars 2003751 inlägg
#3

emission skrev:

Det är ingen IF, det är en OR.

(@VarSpeciality [i]är tom[/i] OR C_SPEC.NAME LIKE @VarSpeciality) AND...

Det är tänkbart att du får stödja upp det hela med en DISTINCT.

Ett OR statement hjälper inte eftersom den fortfarande söker på speciality då.
Men med hjälp av DISTINCT som du sa så fungerade det utmärkt, jag la in första sökningen i en temptabell och sedan gjorde jag en DISTINCT select på allt utom speciality.

emissionMedlem sedan dec. 19996 095 inlägg
#4

SteveP skrev:

Ett OR statement hjälper inte eftersom den fortfarande söker på speciality då.

Nej, det gör den inte, men om du har joinat in en extra tabell, så försvinner inte den i och med OR. En DISTINCT på själva bassökningen räcker, såvida du inte plockar med kolumner från den injoinade tabellen i SELECT-listan.

SteveP skrev:

Men med hjälp av DISTINCT som du sa så fungerade det utmärkt, jag la in första sökningen i en temptabell och sedan gjorde jag en DISTINCT select på allt utom speciality.

Temp-tabeller kan vara mördande för prestanda, men visst är de nödvändiga ibland. Eftersom du verkar använda en DBMS som stöder temptabeller så kan du säkert också använda s.k derived tables.


SELECT DISTINCT blablabla FROM 
(
   SELECT blublublu FROM ..... WHERE .....
) tabellalias
Genererad på 359 ms · cache AV · v20260730165559-full.f96bc7eb