Just nu i M3-nätverket
Gå till innehåll

Rangordna SELECT-val?


tinak

Rekommendera Poster

Jag håller på med en databas i SQL Server och har stött på ett problem. Ett antal personer ska listas med sitt telefonnummer (Nummer ligger i separat tabell). Nummerna har olika typer, Arbete, Mobil, Hem osv. Problemet är hur rätt nummer ska visas när personerna ska listas, då bara ett nummer ska visas och personen endast ska listas en gång. Helst skulle jag vilja rangordna nummerna. Om ingen hemtelefon finns ska mobilnumret visas. Finns det inga nummer kopplade till personen ska NULL visas.

 

Just nu har jag en lösning som antingen listar hemnumret, eller visar NULL om inga nummer finns lagrade för personen. Men om personen har t ex ett mobilnummer kommer inte denna med.

 

WHERE TelefonTyp.beskrivning = 'hem' OR NOT EXISTS(SELECT* FROM Telefon WHERE Telefon.persId = Personal.persId)

 

Någon som har nåt tips på hur jag kan göra? Är rätt ny på SQL så jag har inte lärt mig alla knep än =)

 

Länk till kommentar
Dela på andra webbplatser

Om vi säger att du i tabellen Phone har tre fält, Phone1, Phone2, Phone3 och vill i listningen visa det första av dessa där telefonnumret inte är Null kan du använda:

 

[color="#0000ff"]SELECT[/color]     ISNULL(Phone1, ISNULL(Phone2, ISNULL(Phone3, [color="#ff0000"]'[/color]Inget nr lagrat[color="#ff0000"]'[/color]))) [color="#0000ff"]AS[/color] PhoneNo
[color="#0000ff"]FROM[/color]         Phone

 

Om alla fält är Null returneras strängen "Inget nr lagrat"

 

Fast jag ser att du har någon tabell kallad TelefonTyp där också. Jag tror du har krånglat till det hela lite. Posta gärna en beskrivning på de tabeller du har.

[inlägget ändrat 2004-10-12 19:07:58 av Anjuna Moon]

Länk till kommentar
Dela på andra webbplatser

Tabellerna ser ut så här förenklat:

 

Telefon:

telNr #

typId **

persNr **

 

TelefonTyp

typId #

beskrivning <--- denna innehållar 'Arbete', 'Hem' eller 'Mobil'

 

Person

persNr #

fNamn

eNamn

 

går det att sätta TelefonTyp = 'Arbete' för Phone1 osv eller måste det lösas på annat sätt då?

 

Länk till kommentar
Dela på andra webbplatser

Ok, har du gjort denna modell för att du vill tillåta ex. valfritt antal hemnr, arbetsnr osv. samt tillåta fler typer att läggas till. Om du bara ska ha dessa tre typer och bara tillåta ett av varje förslår jag att du lägger in allt i samma tabell.

 

 

 

Länk till kommentar
Dela på andra webbplatser

Det ska gå att lägga in ett fritt antal nummer för flera olika typer vid behov. Det här är ett skolprojekt och då finns ju en del krav på normalisering och redundant data och allt vad det heter...

 

Länk till kommentar
Dela på andra webbplatser

Japp, helt korrekt. Då fortsätter vi med den struktur du har nu.

 

Hursomhelst, lägg till ett fält "prioritet" i din tabell TelefonTyp, där 1=högsta prioritet, 2=snäppet under osv.

Använd sen följande sats för att få ut antingen telefonnumret med högst prio, eller Null om inget nr finns: (Frågan skriven för person med persnr=111111)

 

[color="#0000ff"]SELECT[/color]     [color="#0000ff"]TOP[/color] 1 P.fNamn, P.eNamn, T.telNr, TT.beskrivning
[color="#0000ff"]FROM[/color]         Person P LEFT [color="#0000ff"]OUTER JOIN[/color]
                      Telefon T [color="#0000ff"]ON[/color] T.persNr = P.persNr LEFT [color="#0000ff"]OUTER JOIN[/color]
                      TelefonTyp TT [color="#0000ff"]ON[/color] TT.typId = T.typId
[color="#0000ff"]WHERE[/color]     (P.persNr = 111111)
[color="#0000ff"]ORDER BY[/color] TT.prioritet

 

Om du har fler telefonnummer med samma prio kommer förstås bara ett av dessa att visas.

[inlägget ändrat 2004-10-12 19:49:44 av Anjuna Moon]

Länk till kommentar
Dela på andra webbplatser

Istället för att stapla ISNULL på varandra kan man använda COALESCE:

 

[color="#0000ff"]SELECT[/color] COALESCE(Phone1, Phone2, Phone3) [color="#0000ff"]FROM[/color] ...

 

Då får man det första värdet som är inte är NULL. Dessutom skriver man portabel kod eftersom COALESCE ingår i SQL-standarden till skillnad från ISNULL.

 

Länk till kommentar
Dela på andra webbplatser

Nice jarlh, tack för det tipset! Poäng!

 

OFFTOPIC: Vad jobbar du med på mimer?

 

[inlägget ändrat 2004-10-13 09:12:43 av Anjuna Moon]

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...