Avatar billede mik789 Nybegynder
19. oktober 2003 - 10:59 Der er 19 kommentarer og
1 løsning

udtræk uden foranstillede nuller

hvis man i en databasetabel har en serie tekststrenge på formen 00-99.0-9.0-9, altså f.eks.:

"03.5.6"
"10.0.1"

hvordan fjerner man så foranstillede (men kun foranstillede) nuller i visningen? Dvs. så de to strenge bliver vist som :

"3.5.6"
"10.0.1"

Kan det gøres i selve mysql forespørgslen, eller skal man over en php funktion?

//mik
Avatar billede jakobclausen Nybegynder
19. oktober 2003 - 11:05 #1
Kan du ikke bruge det som erikjacobsen skrev til dig i sidste spørgsmål:

I PHP:

  $a="0000010";

  print 0+$a;

så er nullerne væk ;)
Avatar billede Slettet bruger
19. oktober 2003 - 11:08 #2
mysql> SELECT TRIM(LEADING '0' FROM '03.5.6');
-> '3.5.6'
Avatar billede mik789 Nybegynder
19. oktober 2003 - 11:16 #3
jakobclausen> jo, sikkert godt, men det er jo nemmere hvis det kan gøre i selve forespørgslen.

el_barto> kan det generaliseres? hvis det f.eks. djejer som feltet "ID" i tabellen "artikler"?
Avatar billede Slettet bruger
19. oktober 2003 - 11:24 #4
SELECT TRIM(LEADING '0' FROM ID) FROM artikler
Avatar billede mik789 Nybegynder
19. oktober 2003 - 11:39 #5
el_barto> tak skal du ha'. Jeg tester lidt senere i dag og vender tilbage ;-)
Avatar billede mik789 Nybegynder
19. oktober 2003 - 15:28 #6
OK, men for en ID på "01.05" giver forespørgslen med trim bare "1.05", ikke "1.5" som jeg godt ville have. Så måske hvis ikke der er andre muligheder i sql koden, er det måske bedre at gøre det i php som anvist af erikjacobsen.

men tak for oplysningen el_barto. Læg lige et svar. Også erikjacobsen, hvis han er med her.
Avatar billede mik789 Nybegynder
19. oktober 2003 - 15:34 #7
el_barto> et sidste sp.: hvis jeg til din kode tilføjer: ORDER BY ID. altså:

SELECT TRIM(LEADING '0' FROM ID) FROM artikler ORDER BY ID;

- vil der så blive ordnet ud fra de originale ID strenge eller ud fra de trimmede? Jeg går ud fra at det vil være ud fra de originale, hvilket det også skal.
Avatar billede Slettet bruger
19. oktober 2003 - 16:19 #8
Nej den sorterer efter de trimmede, men hvis du vil sortere efter de originale kan du gøre sådan her:

SELECT ID AS FOER_ID, TRIM(LEADING '0' FROM ID) AS ID FROM artikler ORDER BY FOER_ID;
Avatar billede Slettet bruger
19. oktober 2003 - 16:25 #9
Dit spørgsmål lød bare på "hvordan fjerner man så foranstillede (men kun foranstillede)"

Hvis du vil fjerne alle nuller bliver det jo lidt avanceret, da det ikke lyder til at du vil have 10.0.1 til at blive til 1..1
Avatar billede Slettet bruger
19. oktober 2003 - 16:25 #10
1.05 er jo heller ikke det samme som 1.5

1.5 krone er 1 krone og 50 ører, hvor 1.05 er 1 krone og 5 ører
Avatar billede mik789 Nybegynder
19. oktober 2003 - 16:50 #11
el_barto> nej det er klart, men sagen er at disse værdier ikke er decimaltal men tekststrenge (punkter i en indholdsfortegnelse) i princippet på formen 00-99.00-99. De skal kunne ordnes således at 10.5 kommer efter 9.3, men de skal vises uden foranstillede nuller ligesom i en disposition som flg.:

1.1 for 01.01
1.2 for 01.02
1.3 for 01.03
2.1 for 02.02
2.2 for 02.02
2.3 for 02.03

osv.

se evt. erikjacobsen 19/10-2003 10:26:05 i sp. http://www.eksperten.dk/spm/415813 hvor problemet er beskrevet
Avatar billede Slettet bruger
19. oktober 2003 - 16:57 #12
Så er det nok alligevel nemmere at hive hele balladen ud i et array, og så køre en gang PHP på det som erikjacobsen skriver.
Avatar billede Slettet bruger
19. oktober 2003 - 16:58 #13
Du kunne også finde en _rigtig_ MySQL haj der kunne lave lidt regulære udtryk, for det kan man også i MySQL :)
Avatar billede arne_v Ekspert
19. oktober 2003 - 19:19 #14
SELECT TRIM(LEADING '0' FROM REPLACE(feltnavn, '.0','.')) ...
Avatar billede mik789 Nybegynder
19. oktober 2003 - 22:03 #15
arne_v> det ser lovende ud - prøver, for alt andet lige er det nok nemmere for mig at det gøres i selve udtrækket frem for bagefter i php.
Avatar billede mik789 Nybegynder
19. oktober 2003 - 22:24 #16
arne_v> og el_barto> når jeg kombinerer jeres kode får jeg:

select ID as foer_ID, trim(leading '0' from replace(ID,'.0','.')) from artikler order by foer_ID;

som giver det helt rigtige resultat, f.eks.:

+-------|-------+
| 01.01 |  1.1  |
+-------|-------|
| 10.02 | 10.2  |
+-------|-------+

så el_barto, læg også du lige et svar ;-)
Avatar billede Slettet bruger
19. oktober 2003 - 22:50 #17
Ellers tak, jeg har point nok ;)
Avatar billede mik789 Nybegynder
20. oktober 2003 - 00:18 #18
lille tillægsspørgsmål (hvis nogle ser med, når sp. er lukket):

jeg kan ikke bruge mine "as"-felter i en where-sætning. hvis jeg f.eks. siger:

select trim(leading '0' from replace(ID,'.0'.'.')) as trim_ID, forfatter from artikler where trim_ID = '1.1';

får jeg fejl: unknown column 'trim_ID' in 'where clause'
:-(
kan nogen stadig hjælpe?
Avatar billede mik789 Nybegynder
20. oktober 2003 - 08:38 #19
ok, jeg fortsætter med et nyt sp.....
Avatar billede arne_v Ekspert
20. oktober 2003 - 09:19 #20
Vi ser med på lukkeded spørgsmål.

Men ikke altid efter midnat ...

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