Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[SQL] CASE WHEN ELSE vraag

Pagina: 1
Acties:

  • Keess
  • Registratie: Augustus 2006
  • Laatst online: 10:08
Goedemorgen.

Ik zit met een probleem, ik heb drie (test) tabellen aangemaakt, header, details en details2.

header
id
titel
datum
dtabel

details
id
tekst
header_id

details2
id
tekst
header_id



de tabellen details en details2 zijn exact hetzelfde, het verschil is dat de data in details permanent is en de data in details2 frequent verwijderd wordt.

Het veld dtabel in header geeft aan welke tabel er gebruikt moet worden, bij 1 => details, 0 => details2, nu kwam ik na wat speurwerk erachter dat dit mogelijk moet zijn met een CASE statement, nu heb ik de volgende query:

SQL:
1
2
3
4
5
SELECT     header.id, header.titel, header.datum, CASE WHEN dtabel = 1 THEN details.tekst ELSE details2.tekst END AS DetailsTekst, 
                      CASE WHEN dtabel = 1 THEN details.id ELSE details2.id END AS DetailsHeaderID
FROM         header AS header CROSS JOIN
                      details AS details CROSS JOIN
                      details2 AS details2[b][/b]


Dit werkt dus niet helemaal zoals het zou moeten werken, ik krijg alles terug vanuit de details(2), logisch, maar hoe kan ik hierop een WHERE statement toepassen, dus wanneer bijvoorbeeld "dtabel" 1 is, kijken of er details zijn in de details tabel met het header id van het id van het huidige header id.

Ook selecteer ik maar 1 veld in de CASE statement, ik mil dus alle velden hebben (originele tabel heeft meer velden).

Ik wil dus afhankelijk van een waarde van een veld informatie uit 1 van de 2 tabellen hebben, de datatypes/veldnamen zijn hetzelfde alleen de tabelnaam is verschillend.

Heb al veel opties geprobeerd maar heb nooit de juiste data gekregen, volgens mij is dit niet al te ingewikkeld maar hoe doe ik dit wel goed?

Bij voorbaat dank,

[ Voor 5% gewijzigd door Keess op 23-05-2008 10:37 ]


  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
ik zou het zelf met een left join en een coalesce oplossen denk ik...
dus zoiets:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
select 
    header.titel,
    header.datum,
    coalesce(A.tekst, B.tekst) as tekst
from
    header
left join
    details A
on
    (
        A.header_id = header.id AND header.dtable = 1
    )
left join
    details B
on
    (
        B.header_id = header.id AND header.dtable = 2
    )


zoiets...

[/code]

  • Redshark
  • Registratie: Mei 2002
  • Laatst online: 18-11 19:44
Ik zou het iig niet met een cross join proberen of gebruik je die voor een hele speciale reden?

Wellicht nog een isnull om de tekst heen om het netjes af te maken?

SQL:
1
2
3
...
isnull(coalesce(A.tekst, B.tekst),'Geen tekst gevonden') as tekst 
..

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 18-11 18:17

Dido

heforshe

Zal ik hem inkoppen, dan? Waarom werk je met dit datamodel :?

Waarom gebruik je niet 1 detail-tabel, mat daarin een vinkje dat aangeeft of de gegevens verwijderd mogen worden of niet?

Dan heb je
• dat veldje niet meer nodig in je header-tabel
• 1 tabel minder
• een genormaliseerd datamodel
• geen lastig gedoe met onleesbare en slecht onderhoudbare queries
• een simpele oplossing voro je probleem

Wat betekent mijn avatar?


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 14:04
Idd, helemaal mee eens Dido!
Scheelt mij weer een hoop typewerk

Roomba E5 te koop


  • Keess
  • Registratie: Augustus 2006
  • Laatst online: 10:08
Met die query kom ik al een heel eind in de buurt, krijg niet alle velden terug, wanneer header.id 1 is, krijg ik 3 resultaten terug, waarvan 1 null, en bij header.id 2, krijg ik geen terug, terwijl er in beide tabellen 2 resultaten te vinden zijn.

Maar goed, met deze informatie zou ik er wel uit moeten komen maar na het lezen van Dido's reactie zit ik toch te denken om de boel om te gooien, ik had van te voren bedacht dat het op deze manier makkelijker/overzichtelijker zou werken, dat is dus totaal niet het geval.

Ik denk dat ik 1 tabel houdt, waarbij ik per record opgeef of deze vaststaat of dat deze verwijderd mag worden mits ie niet in gebruik is, snap niet dat ik dat eerder gedaan heb, misschien zie ik nog iets over het hoofd.

Alle drie bedankt voor het meedenken. :)

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
Dido heeft inderdaad helemaal gelijk...
je kunt mijn query wel gebruiken, maar als je later de zooi wil uitbreiden maak je het nodeloos ingewikkeld voor jezelf... met het voorstel van dido kom je dan een stuk verder...

  • Keess
  • Registratie: Augustus 2006
  • Laatst online: 10:08
Precies, beter nu alles direct goed doen dan straks in de toekomst weer met dezelfde problemen komen te zitten.
Pagina: 1