Avatar billede mborg Nybegynder
24. september 2013 - 10:53 Der er 5 kommentarer

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.

Kan I hjælpe?
Avatar billede teepee Nybegynder
24. september 2013 - 12:27 #1
Tror at du skal omskrive til noget a la (ikke valideret):

select a.* from t_data a
where exists (select 1 from t_kriterier b [og så din where clause]
)
Avatar billede mborg Nybegynder
24. september 2013 - 13:04 #2
Det virker ikke rigtigt, da:

1) jeg har behov for at få vist data fra tabel b

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å)

Ved ikke om det giver mening??
Avatar billede arne_v Ekspert
28. september 2013 - 22:36 #3
Faar du ikke samtidighedsproblemer med den kriterie tabel??
Avatar billede mborg Nybegynder
30. september 2013 - 10:18 #4
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.
Avatar billede arne_v Ekspert
01. oktober 2013 - 01:54 #5
to samtidige brugere med forskellige kriterier
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