[SQL] Naam tabellen koppelen

Pagina: 1
Acties:

Onderwerpen


  • CaVeFiSh
  • Registratie: Januari 2005
  • Laatst online: 27-03 14:26
Ik ben bezig met een kleine database voor mezelf en loop een beetje vast op 1 query. Ik heb drie tabellen:
- first_name
- sur_name
- last_name

Deze drie tabellen wil ik koppelen zodat ze 1 volledige naam geven. Nu heb ik het volgende geprobeerd:

code:
1
SELECT first_name+' '+sur_name+' '+last_name AS 'Naam'


Dit geeft een goede output indien alle drie de tabellen zijn ingevult, nu is mijn probleem dat dus niet alle sur_name velden een waarde bevatten en er dus een dubbele spatie uitkomt. Dit probeer ik op te lossen en via google stuitte ik op CASE en heb het volgende geprobeerd:

code:
1
2
3
4
5
6
SELECT 
'Naam' =
CASE
WHEN sur_name = 0 THEN first_name+' '+last_name 
ELSE first_name+' '+sur_name+' '+last_name
END,


Helaas krijg ik hiermee de volgende error:
Conversion failed when converting the varchar value 'van' to data type int.

Jammer genoeg weet ik dus niet hoe ik dit kan oplossen en heb ook geen idee meer waar ik het moet zoeken. Heb ook al gespeeld met tussen haakjes zetten en dergelijke maar niets mocht baten. Misschien dat jullie me de juiste richting in kunnen sturen?

http://eu.battle.net/d3/en/profile/cavefish-2679/


  • Martijntj
  • Registratie: Juli 2004
  • Laatst online: 12:30
Begint eens met WHEN sur_name='' want hij zal natuurlijk nooit een integer zijn.

  • ik222
  • Registratie: Maart 2007
  • Niet online
Waarom haal je via sql niet alleen de waardes op bouw de uiteindelijke String op in je programmacode?

Bovendien bedoel je drie verschillende kolommen in één tabel en geen drie tabellen.

[ Voor 30% gewijzigd door ik222 op 25-02-2010 18:47 ]


  • CaVeFiSh
  • Registratie: Januari 2005
  • Laatst online: 27-03 14:26
Mijn god, natuurlijk... ben al een uur aan het zoeken en rommelen en kijk ik daar overheen. Thanks.. dat was idd de oplossing

http://eu.battle.net/d3/en/profile/cavefish-2679/


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

SQL:
1
SELECT first_name+COALESCE(' '+sur_name+' ', ' ')+last_name AS 'Naam'

;)

Surname is trouwens een ander woord voor last name. Je naamgeving voor een veld dat waarschijnlijk tussenvoegsels zal bevatten is dus niet echt goed. ;)

[ Voor 47% gewijzigd door NMe op 25-02-2010 18:48 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • CaVeFiSh
  • Registratie: Januari 2005
  • Laatst online: 27-03 14:26
haha oke, heb het naampje al aangepast klopt idd niet. Ik ben ook net een beginner met SQL dus zie af en toe door de bomen het bos niet meer. Maar begint al steeds beter te worden :)

http://eu.battle.net/d3/en/profile/cavefish-2679/


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

We moeten allemaal ergens beginnen. ;)

Overigens werkt mijn oplossing alleen als sur_name (of hoe de kolom nu ook heet) NULL is wanneer die leeg is, voor lege strings werkt 'ie niet. :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
offtopic:
Leuk feitje: de engelsen (amerikanen, whatevah) kennen helemaal geen 'tussenvoegsels' of hebben daar althans niet echt een woord voor. Da's altijd ellende :P Ik gebruik meestal preposition of surname_prefix...


@TS Je moet trouwens eens even kijken naar je terminologie. Je hebt het over tabellen waar je velden bedoelt ;)
Ik zou 't, als 't in SQL moest althans, zo hebben gedaan:
SQL:
1
Select TRIM(first_name+' '+sur_name+' '+last_name) From...

(Waarbij ik even aanneem dat voor je RDBMS de + operator een concatenatie operator is, want vaak is 't een enkele of dubbele | (de pipe dus))
Voor MSSQL die geen TRIM kent maar wel een LTRIM en RTRIM:
SQL:
1
Select RTRIM(LTRIM(first_name+' '+sur_name+' '+last_name)) From...


Maar je laat dit 't best over aan je view/gui. Dus de volgende keer even ook het RDBMS (MySQL/MSSQL/Oracle/Whatever) vermelden; da's wel zo handig.

[ Voor 72% gewijzigd door RobIII op 25-02-2010 19:25 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • CaVeFiSh
  • Registratie: Januari 2005
  • Laatst online: 27-03 14:26
code:
1
RTRIM(LTRIM(first_name+' '+prefix+' '+last_name)),


Met dit behoud ik de dubbele spatie in de namen waar geen prefix in voorkomt.

code:
1
2
3
4
5
'Naam' =
CASE
WHEN prefix = '' THEN first_name+' '+last_name
ELSE first_name+' '+prefix+' '+last_name
END,


Met deze code doet die het nu perfect, nogmaals hartstikke bedankt jongens... ik kan nu weer verder de boeken in _/-\o_

http://eu.battle.net/d3/en/profile/cavefish-2679/


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
CaVeFiSh schreef op donderdag 25 februari 2010 @ 19:28:
code:
1
RTRIM(LTRIM(first_name+' '+prefix+' '+last_name)),


Met dit behoud ik de dubbele spatie in de namen waar geen prefix in voorkomt.
8)7 Goeiemorgen :X My bad. |:(

SQL:
1
RTRIM(first_name+' '+LTRIM(RTRIM(sur_name+' '+last_name)))

Of:
SQL:
1
TRIM(first_name+' '+TRIM(sur_name+' '+last_name))


(Waarbij ik nog even je (foutieve) sur_name heb gehanteerd)

Maar hoe dan ook: dit wil je helemaal niet in SQL doen maar in je applicatie afhandelen.

[ Voor 35% gewijzigd door RobIII op 25-02-2010 19:34 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

RobIII schreef op donderdag 25 februari 2010 @ 19:30:
[...]

8)7 Goeiemorgen :X My bad. |:(

SQL:
1
RTRIM(first_name+' '+LTRIM(RTRIM(sur_name+' '+last_name)))
Beide RTRIM's zijn daar overbodig voor de oplossing van het probleem though. :+

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
NMe schreef op donderdag 25 februari 2010 @ 22:45:
[...]

Beide RTRIM's zijn daar overbodig voor de oplossing van het probleem though. :+
Ook nog eens ja; ik ging er even van uit dat elk van de 3 leeg kan zijn.
offtopic:
Ga's wat nuttigs doen i.p.v. je minions lopen corrigeren :+

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Ram0n
  • Registratie: Maart 2002
  • Laatst online: 03-07 13:05

Ram0n

Bierbrouwende nerd

Je kan ook CONCAT_WS gebruiken, die slaat automatisch lege velden over en bezorgt je dus geen dubbele spaties.

code:
1
CONCAT_WS(' ', first_name, sur_name, last_name)

[ Voor 22% gewijzigd door Ram0n op 26-02-2010 12:41 ]

Eigenaar/brouwer Milky Road Brewery

Pagina: 1