Avatar billede stephanryer Nybegynder
11. januar 2007 - 16:21 Der er 9 kommentarer og
1 løsning

Søging i records, dynamisk WHERE clause?

Når man fx skal kunne søge på fire kriterier i en tabel, så er det ofte at man kun skal søge på nogen af kriterierne.

Derfor ville det være brugbart hvis man fx kunne sige

SELECT X FROM X
WHERE
x = X
IF(@kategoriid != -1) BEGIN
  AND kategoriid = @kategoriid
END
IF(@kategoriid != -1) BEGIN
  AND kategoriid = @kategoriid
END
IF(@kategoriid != -1) BEGIN
  AND kategoriid = @kategoriid
END

Dette ville kunne gøre, at man kunne benytte én stored procedure til alle søgninger i en database og ikke skal oprette en stored procedure i databasen for hver kombination af søgekriterier.

Er der nogen måde hvorpå man rent faktisk kan gøre dette?
Jeg bruger MS SQL 2000

På forhånd tak
Avatar billede dr_chaos Nybegynder
11. januar 2007 - 17:07 #1
Du kan gøre sådan her:

DECLARE @SQL varchar(8000),@kategoriid int
SET @kategoriid=1
SET @SQL='SELECT X FROM X
WHERE 1=1 '

IF(@kategoriid != -1) BEGIN
  SET @SQL= @SQL +' AND kategoriid ='+CONVERT(Varchar(50), @kategoriid)
END
IF(@kategoriid != -1) BEGIN
  SET @SQL= @SQL +' AND kategoriid ='+CONVERT(Varchar(50), @kategoriid)
END
IF(@kategoriid != -1) BEGIN
  SET @SQL= @SQL +' AND kategoriid ='+CONVERT(Varchar(50), @kategoriid)
END


EXEC(@SQL)
Avatar billede stephanryer Nybegynder
11. januar 2007 - 17:35 #2
Ohhh, altså du gemmer faktisk en SQl sætning i en variabel som du så eksekverer?

Men ryger performancefordelen så ikke i forbindelse med stored procedures?
Avatar billede dr_chaos Nybegynder
11. januar 2007 - 17:40 #3
en smule.
Jeg fandt lige en bedre metode:

SELECT *
FROM Customers
WHERE Cus_Name = COALESCE(@Cus_Name,Cus_Name) AND
      Cus_City = COALESCE(@Cus_City,Cus_City) AND
      Cus_Country = COALESCE(@Cus_Country,Cus_Country)
Avatar billede dr_chaos Nybegynder
11. januar 2007 - 17:40 #4
Avatar billede stephanryer Nybegynder
11. januar 2007 - 17:56 #5
Det der ser interessant ud! Pænt nice. Smid point.

Kan være jeg spørger om noget mere, men du kan ligeså godt få pointene nu :)

Takker
Avatar billede dr_chaos Nybegynder
11. januar 2007 - 17:57 #6
np :)

svar.
Avatar billede stephanryer Nybegynder
11. januar 2007 - 18:07 #7
lige en anden ting:

Findes der en form for else til CASE?

fx SELECT
      CASE
          WHEN navn = 'jensen'
          THEN 'Heman'
          WHEN navn = 'Hansen'
          THEN 'Superman'
          ELSE
            --- NOGET HER ---
          END
Avatar billede dr_chaos Nybegynder
11. januar 2007 - 18:11 #8
SELECT
      CASE navn
          WHEN 'jensen'
          THEN 'Heman'
          WHEN 'Hansen'
          THEN 'Superman'
          ELSE
          'intet valgt'
          END
Avatar billede stephanryer Nybegynder
11. januar 2007 - 18:28 #9
doh, lige ud af landevejen. Takker :)
Avatar billede dr_chaos Nybegynder
11. januar 2007 - 18:31 #10
np :)
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
Kategori
Computerworld tilbyder specialiserede kurser i database-management

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