Just nu i M3-nätverket
Jump to content

Rangordna SELECT-val?


tinak

Recommended Posts

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

 

Link to comment
Share on other sites

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]

Link to comment
Share on other sites

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

 

Link to comment
Share on other sites

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.

 

 

 

Link to comment
Share on other sites

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...

 

Link to comment
Share on other sites

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]

Link to comment
Share on other sites

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.

 

Link to comment
Share on other sites

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]

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.



×
×
  • Create New...