Avatar billede lbaad Nybegynder
02. marts 2007 - 09:35 Der er 23 kommentarer og
4 løsninger

TRIM af concatenerede kolonner

Hejsa

Jeg har en forespørgsel, som skal concat 2 kolonner:

select (firstnam1||' '||firstname2) as fornavn from person;

Er der nogen mulighed for, at jeg kan trimme fornavn, så den kun kommer til at indeholde de antal karakterer, for det enkelte resultat?

Mvh
Lars
Avatar billede lap Nybegynder
02. marts 2007 - 09:46 #1
select (ltrim(firstname1)||' '||ltrim(firstname2))as fornavn from person;
Avatar billede lap Nybegynder
02. marts 2007 - 09:47 #2
eventuelt
select ltrim(ltrim(firstname1)||' '||ltrim(firstname2))as fornavn from person;

kan ikke rigtig se hvordan du bruger dine felter
Avatar billede teepee Nybegynder
02. marts 2007 - 09:52 #3
er det fordi den skal forkortes, er det det du mener med trim?
I så fald skal du bruge substr(felt,startpos,længde)
Avatar billede pgroen Nybegynder
02. marts 2007 - 10:02 #4
Er det fordi dine kolonner ikke er varchar2, at du har det her behov ?
Avatar billede lbaad Nybegynder
02. marts 2007 - 10:19 #5
Desværre "lap". Den query giver samme resultat, som det jeg selv skrev.

teepee. Jeg kan ikke bruge substr, da jeg ikke ved hvor langt kolonnen er?

pgroen: De er begge varchar2

/Lars
Avatar billede lbaad Nybegynder
02. marts 2007 - 10:22 #6
Jeg skal trimme eventuelle spaces væk fra bagenden af resultatet.

/Lars
Avatar billede lap Nybegynder
02. marts 2007 - 10:56 #7
kan vi få data eksempler - det virker hos mig
Avatar billede bimbambusse Nybegynder
02. marts 2007 - 11:06 #8
jeg tror teepee mente
select trim(firstname1)||' '||trim(firstname2)

til forskel fra ltrim der kun fjerne de første blanktegn, fjerner trim funktionen på foran og bagved stillede blanktegn - som:
ltrim(rtrim(firstname1))||' '||ltrim(rtrim(firstname2))
Avatar billede lbaad Nybegynder
02. marts 2007 - 11:25 #9
resultatet er, lige meget hvad jeg skriver:
Lars                                                ;Baad                              ;
Om det er ltrim eller trim, så bliver resultatet det samme.

/Lars
Avatar billede lap Nybegynder
02. marts 2007 - 11:35 #10
ja, fordi ltrim fjerner de sidste blanktegn - men sidste tegn er ;

prøv med:
select ltrim(ltrim(substr(ltrim(firstname1),1,length(ltrim(firstname1)-1))))||' '||
ltrim(substr(ltrim(firstname2),1,length(ltrim(firstname2),1,length(ltrim(firstname2)-1)))) as fornavn from person;
Avatar billede lbaad Nybegynder
02. marts 2007 - 11:57 #11
lap: har du fået den til at køre???
Jeg får en fejl, når jeg kører den:
ERROR at line 2:
ORA-00909: invalid number of arguments (det er length, som den peger på)
Avatar billede lap Nybegynder
02. marts 2007 - 12:51 #12
denne virker - den er gal med parantesernes placering:

select trim(substr(trim(firstname1),1,length(trim(firstname1))-1))||' '||
trim(substr(firstname2),1,length(trim(firstname2))-1))||'x' as person
from person
Avatar billede lap Nybegynder
02. marts 2007 - 12:52 #13
et ||'x' for meget - må du selv fjerne :-)
Avatar billede Slettet bruger
03. marts 2007 - 13:12 #14
Er det ikke ved at blive lidt for kompliceret for jer ;-)

Lbaad kan 'nøjes' med at skrive:

SELECT TRIM(FIRSTNAME1 || ' ' || FIRSTNAME2) FORNAVN
FROM PERSON;
Avatar billede lap Nybegynder
04. marts 2007 - 12:26 #15
problemet er netop, at data ikke er "rene" - der er et ; i sidste tegn af data - som skal ignoreres.
Avatar billede Slettet bruger
04. marts 2007 - 16:47 #16
Du kan bruge REPLACE til at fjerne uønskede tegn. Du kan bruge TRIM til at fjerne uønskede space-tegn foran og bag tekst. Du kan derfor skrive

SELECT TRIM( REPLACE ( REPLACE( FIRSTNAME1 || ' ' || FIRSTNAME2 ), ';' ), '  ' ) ) FORNAVN
FROM PERSON;

(konkatenér fornavn og efternavn, fjern evt. semikolonner, fjern evt. forekomster af to mellemrum, fjern foranstående og bagvedstående mellemrum)
Avatar billede Slettet bruger
05. marts 2007 - 09:04 #17
Og det ovenstående var forkert. Det fjerner alle dobbeltmellemrum, så man risikerer at 'A  B' bliver til 'AB'.

Så en rettelse må være

SELECT TRIM( TRIM( REPLACE( FIRSTNAME1, ';' ) ) || ' ' || FIRSTNAME2 ) FORNAVN
FROM PERSON;

(fjern semikolon fra firstname1, fjern overflødige spaces fra firstname1, konkatenér med firstname2, fjern overflødige spaces)
Avatar billede lbaad Nybegynder
05. marts 2007 - 10:16 #18
Joern_h --> hvis jeg bruger din løsning, så får jeg kun fornavnene ud. Der kommer ingen efternavne med.

lap --> jeg har også prøvet din løsning, men jeg får stadig det samme data ud, altså ikke det rigtige.

I min session skriver jeg:
set colsep ';'

Jeg har også forsøgt mig med at skrive column fornavn format a52 ( som er det maksimale, som fornavnet kan være)
Avatar billede lbaad Nybegynder
05. marts 2007 - 10:27 #19
Sorry, joern_h. Tror stadig jeg er på weekend.
Din løsning, fjerner desværre heller ikke spaces i slutningen af data
Avatar billede lap Nybegynder
05. marts 2007 - 11:30 #20
det er colsep som er problemet - har du brug for den?
Avatar billede lbaad Nybegynder
05. marts 2007 - 11:45 #21
Jeg har brug for den, da jeg skal lave en semikolonseperaret fil.

Er der en anden måde?
Avatar billede Slettet bruger
05. marts 2007 - 20:04 #22
lbaad: laver du det her i SQL-Plus eller i iSQL-Plus?

For at fjerne bagvedstillede spaces skal du lave en SET TRIMSPOOL ON.

Hvis du laver en SET COLSEP ';' er det vel fordi du vil have ';'?

Jeg ville godt se hele dit script, hvis jeg skulle kunne hjælpe. Jeg ville nok stille mig tilfreds med at der er et par spaces med, eller konkatenere alle felterne sammen i een streng med ';'-er imellem.
Avatar billede lbaad Nybegynder
05. marts 2007 - 21:55 #23
SELECT  PQZ_PHONE telefonnummer,
      trim(SUBSTR(trim(firstname1),1,(LENGTH(trim(firstname1)))-1))||' '||
        trim(SUBSTR(trim(firstname2),1,(LENGTH(trim(firstname2)))-1)) person,
        LTRIM((LASTNAME)) Efternavn,
      ADDRESS Gadenavn,
      Getfloor(HOUSE_NUMBER) "Husnr", -- funktion
      Getfloordirection(house_number) "Opgang/Husbogstav", -- funktion
      Getfloor(FLOOR) "Etage",-- funktion
      Getfloordirection(FLOOR) "Enhed på etage", -- funktion
      ZIPCODE Postnr,
      CITY Postdistrikt
  FROM ODS_PERSON p
  JOIN (
    SELECT personId FROM ACCOUNTS 
    WHERE processorId = 1
      AND accountType = 1
      AND TO_DATE('26-02-2007', 'DD-MM-YYYY') BETWEEN startdate AND enddate
    ) A1 ON a1.personId = p.ID
  JOIN (
    SELECT DISTINCT telefon FROM PQZ_SIM
  ) s ON s.telefon = p.pqz_phone;
Avatar billede lbaad Nybegynder
05. marts 2007 - 22:31 #24
Jeg bruger iøvrigt sqlplus fra dos
Avatar billede Slettet bruger
06. marts 2007 - 07:03 #25
Hej lbaad.

Tror du ikke vi har en misforståelse: Jeg antog at FIRSTNAME1 var på formen 'NAVN    ;' (en VARCHAR). Men i virkeligheden er den af formen 'NAVN'. De efterfølgende spaces og ';' kom fra at du bruger 'SET COLSEP ';''.

Så løsningen på dit problem må være:

Lav ikke nogen SET COLSEP

SELECT PQZ_PHONE || ';' ||
  FIRSTNAME1 || NVL ( FIRSTNAME2, ' ' || FIRSTNAME2, '' ) || ';' ||
  LASTNAME || ';'
  ADDRESS || ';'
...

På den måde får du resultatet i een lang streng.
Avatar billede lbaad Nybegynder
07. marts 2007 - 11:39 #26
Hej Joern_h
Ja, det var den nemme løsning. Nu virker det.

Jeg fordeler points, da "lap" også gjorde et forsøg.
Det er jo heller ikke nemt, når alle oplysninger ikke står der.

Mange tak for hjælpen.
/Lars
Avatar billede lbaad Nybegynder
09. marts 2007 - 13:32 #27
Det kunne den så ikke finde ud af, så i har fået halvdelen hver.
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