Oracle SQL: Dynamiske where kriterier i seperat tabel
Jeg ønsker at anvende en tabel til indtastning af en række "søge"-kriterier, og anvende en sql-forespørgsel til at hive data fra min kilde. Når der kommer et nyt søgekriterie, så skal dette indtastes i tabellen med søge-kriterier og min sql-forespørgsel skal forblive uændret. Dvs. alt vedligehold skal ske via tabellen.
Jeg har en tabel, T_KRITERIER, som indeholder en række kolonner, som samlet set giver mig en "where statement" pr. datapoint id.
f.eks. CREATE TABLE T_KRITERIER (DP, ITEM, PRODUKT, FARVE, STR) Bemærk, at der kan være der godt kan være flere kriterier pr. DP.
EKSEMPEL:
DP ITEM PRODUKT FARVE STR C10 FODTOEJ STOVLER GUL M C10 FODTOEJ SANDALER SORT C09 REGNTOEJ BUKSER L C08 VINTER BUKSER BRUN
Jeg har ligeledes oprettet en sql-forespørgsel som fungerer, så længe at der er "=" mellem kriterierne.
f.eks. SELECT a.* FROM T_DATA a, T_KRITERIER b WHERE a.DP=b.DP and a.ITEM=b.ITEM and (b.PRODUKT is NULL OR a.PRODUKT=b.PRODUKT) and (b.FARVE is NULL OR a.FARVE=b.FARVE) and (b.STR is NULL OR a.STR=b.STR)
Mit problem opstår når jeg f.eks. ønsker alle andre farver end GUL og SORT for f.eks. FODTOEJ, så returnerer forespørgslen farven SORT når jeg vælger at sortere GUL fra og omvendt.
Det er vigtigt for mig at få lavet en så dynamisk kode som muligt, således at nye kriterier kun skal indtastes i tabellen T_KRITERIER.
2) Der er nogle af rækkerne i tabel b som er negative kriterier, dvs. hvor FARVE NOT IN(). Idet kriterierne står i to forskellige rækker opstår der følgende situation:
FARVE NOT IN(SORT) => Alle ITEMS hvor FARVE <> SORT FARVE NOT IN(GUL)=> Alle ITEMS hvor FARVE<>GUL (Men SORT skal heller ikke indgå)
Jeg er ikke helt med på hvad du mener med samtidighedsproblemer, men jo jeg får udfordringer, hvis mine kriterier er af karakeristiska a la NOT IN.
Jeg har løst opgaven ved at lave følgende:
SELECT a.* FROM T_DATA a, T_KRITERIER b WHERE a.DP=b.DP and a.ITEM=b.ITEM and (b.PRODUKT is NULL OR a.PRODUKT=b.PRODUKT) and ((b.FARVE is NULL OR a.FARVE=b.FARVE) AND (b.NOT_FARVE is null OR NOT(a.FARVE IN (select NOT_FARVE FROM T_KRIERIER)) --and (b.STR is NULL OR a.STR=b.STR)
NOT_FARVE er en ny variabel i min T_KRITERIER og det løser problemet, selvom løsningen måske ikke er så smuk.
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.