Avatar billede d_warma Nybegynder
07. december 2004 - 13:01 Der er 17 kommentarer og
2 løsninger

RTRIM problem??

Hej,

Jeg sidder og skal fjerne de sidste 4 karakterer i en streng med variabel længde:
SELECT RTRIM('123420016',substr('abcd0016',-4,4)) "RTRIM e.g."
FROM DUAL;
RTRIM
-----
12342

Hvilket virker fint nok.
Men hvis jeg kører denne sql:
SELECT RTRIM('123410016',substr('abcd0016',-4,4)) "RTRIM e.g."
FROM DUAL;
RTRI
----
1234

Så går det galt, jeg havde forventet:
RTRI
----
12341

Det samme sker gælder for 123400016, 123460016. Det lader til, at det er (0, 1, 6) der giver disse resultater (de tal indgår i det, som skal slettes)

Er der nogen der har en forklaring på dette? Eller en workaround?

Mvh
D_Warma
Avatar billede senj Nybegynder
07. december 2004 - 13:08 #1
Hvad med denne?
SELECT RTRIM(substr('123410016',0,5),substr('abcd0016',-4,4)) "RTRIM" FROM DUAL
Avatar billede d_warma Nybegynder
07. december 2004 - 13:09 #2
Det ændrer ikke noget. Har du selv forsøgt??
Avatar billede senj Nybegynder
07. december 2004 - 13:10 #3
SELECT RTRIM(substr('123410016',0,5)) FROM DUAL jo denne alene?
Avatar billede d_warma Nybegynder
07. december 2004 - 13:13 #4
Det er en variable længde char-streng.
Dvs. at den også skal gælde på 123456780016, hvor jeg skal fjerne 0016 og returnere 12345678.
Avatar billede senj Nybegynder
07. december 2004 - 13:15 #5
Tror du roder lidt med trim, da du forkorter (substr) din trim klausul og du skal vel substringe dit resultat?
Avatar billede senj Nybegynder
07. december 2004 - 13:29 #6
Ahha nu tror jeg at jeg ved hvad du vil:

SELECT  SUBSTR('123456780016',0,length('123456780016')-4)A FROM DUAL

SELECT  SUBSTR('12345678220016',0,length('12345678220016')-4)A FROM DUAL

SELECT  SUBSTR('1234567822554880016',0,length('1234567822554880016')-4)A FROM DUAL

Prøv disse 3 SQL´s
Avatar billede senj Nybegynder
07. december 2004 - 13:32 #7
ovenstående 3 sql med RTRIM (trim fra højre efter 0016) giver samme resultat med følgende 3 sql´s:

SELECT  RTRIM('123456780016','0016') A FROM DUAL

SELECT  RTRIM('12345678220016','0016') A FROM DUAL

SELECT  RTRIM('1234567822554880016','0016')A FROM DUAL
Avatar billede teepee Nybegynder
07. december 2004 - 13:41 #8
select substr(l_tekst, length(l_tekst)-4) from dual;
Avatar billede d_warma Nybegynder
07. december 2004 - 14:17 #9
senj,
Har du prøvet at køre:
SELECT  RTRIM('1234567810016','0016') A FROM DUAL
når det sidste ciffer 12345678(1)0016 før det der skal slettes er indeholdt i det der skal slettes '0016', så bliver det indsatte 1-tal også fjernet. Det samme gælder for 0 og 6?
Avatar billede d_warma Nybegynder
07. december 2004 - 14:24 #10
teepee.
Problemet er ikke substring funktionen, men RTRIM funktionen.
Men tak for buddet.
Avatar billede senj Nybegynder
07. december 2004 - 14:26 #11
Ja det er fordi 1-0-6 findes i den TRIMS klausul. Den stopper først med at trimme når den finder 1. char den ikke kan skifte (trimme). Står der altid 0016 tilsidst vil denne virke : SELECT  SUBSTR('123456780016',0,length('123456780016')-4)A FROM DUAL virke
- det er den samme som ovenfor
Avatar billede d_warma Nybegynder
07. december 2004 - 14:49 #12
Kanon, nu fik jeg den til at virke.
Men det er vel teepee der kom med den rigtige løsning?
senj får alligevel lidt point for ihærdige forsøg på at overbevise mig
Avatar billede senj Nybegynder
07. december 2004 - 14:52 #13
Ikke enig!

Teepee´s løsning giver var:
select substr('1234567810016',length('0016')-4) from dual;
Det giver 1234567810016

??
Avatar billede d_warma Nybegynder
07. december 2004 - 15:01 #14
Vil du argumentere, at dine forslag ligger tættere på løsningen før teepee svarede, end teepee's svar (som rigtig nok ikke gav det ønskede resultat)?
Det ser umiddelbar ud til, at du ændrer dit svar efter teepee har svaret, således at det ligner teepee's svar mere end det ligner dine tidligere besvarelser.
Avatar billede senj Nybegynder
07. december 2004 - 15:04 #15
Slet ikke enig!

Se Kommentar: senj 07/12-2004 13:29:29, der er svaret. Teepee foreslår en substr magen til min 07/12-2004 13:41:01.
Avatar billede d_warma Nybegynder
07. december 2004 - 15:07 #16
Damn, du har ret...
Jeg har overset det i farten...
Kan jeg ændre det eller fodre dig med ekstra 30 point for at holde det hemmeligt ;o)..
Avatar billede senj Nybegynder
07. december 2004 - 15:09 #17
Point betyder ik noget :-)

- Skulle bare lige redde æren du ved.

Vh
senj
Avatar billede d_warma Nybegynder
07. december 2004 - 15:16 #18
Al ære til senj!!
Det er kommentaren fra senj 07/12-2004 14:26:21, der indeholder det korrekte svar.
Al ære til senj!!

Håber det redder det lidt ;o)
Avatar billede senj Nybegynder
07. december 2004 - 15:19 #19
cool
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