|
| CAST - hvordan? Fra : Brian Emilius |
Dato : 24-10-04 22:08 |
|
Hej NG
Jeg har en mysql-database med et varchar-felt, der skal opfattes som int og
sorteres ASC. Felterne ser nogenlunde sådan ud (og burde sorteres således):
1
2
2_1
2_2
3
3_1 osv...
Jeg har prøvet med "ORDER BY CAST(feltnavn AS SIGNED) ASC", men det
resulterer blot i noget i retning af:
1
2_1
2
2_2
3
3_1
Mit spørgsmål er så: Hvordan kan jeg få sorteret min tabel rigtigt? Skal jeg
overhovedet bruge CAST?
Venlig hilsen
Brian Emilius
| |
rpje (24-10-2004)
| Kommentar Fra : rpje |
Dato : 24-10-04 23:37 |
|
"Brian Emilius" skrev d. 24-10-04 22:08 dette indlæg :
> Hej NG
>
> Jeg har en mysql-database med et varchar-felt, der skal opfattes som
int og
> sorteres ASC. Felterne ser nogenlunde sådan ud (og burde sorteres
således):
> 1
> 2
> 2_1
> 2_2
> 3
> 3_1 osv...
>
> Jeg har prøvet med "ORDER BY CAST(feltnavn AS SIGNED) ASC", men det
> resulterer blot i noget i retning af:
> 1
> 2_1
> 2
> 2_2
> 3
> 3_1
>
> Mit spørgsmål er så: Hvordan kan jeg få sorteret min tabel rigtigt?
Skal jeg
> overhovedet bruge CAST?
>
> Venlig hilsen
> Brian Emilius
>
>
Select Cast(SubString(GebyrNr,1,1)+
SubString(GebyrNr,3,1)+
SubString(GebyrNr,5,1)+
SubString(GebyrNr,7,1)+
SubString(GebyrNr,9,1)+
SubString(GebyrNr,11,1) as int) as num
From Gebyr
Order by GebyrNr
Giver dette resultat
1
11
12
13
2
21
22
23
3
31
32
33
34
4
Select Cast(SubString(GebyrNr,1,1)+
SubString(GebyrNr,3,1)+
SubString(GebyrNr,5,1)+
SubString(GebyrNr,7,1)+
SubString(GebyrNr,9,1)+
SubString(GebyrNr,11,1) as int) as num
From Gebyr
Order by Cast(SubString(GebyrNr,1,1)+
SubString(GebyrNr,3,1)+
SubString(GebyrNr,5,1)+
SubString(GebyrNr,7,1)+
SubString(GebyrNr,9,1)+
SubString(GebyrNr,11,1) as int)
Giver dette resultat
1
2
3
4
11
12
13
21
22
23
31
32
33
34
MV
Peter Jensen
--
Leveret af:
http://www.kandu.dk/
"Vejen til en hurtig løsning"
| |
Brian Emilius (25-10-2004)
| Kommentar Fra : Brian Emilius |
Dato : 25-10-04 18:11 |
|
"rpje" <rpje.news@kandu.dk> skrev i en meddelelse
news:417c2f34$0$174$edfadb0f@dtext02.news.tele.dk...
> Select Cast(SubString(GebyrNr,1,1)+
> SubString(GebyrNr,3,1)+
> SubString(GebyrNr,5,1)+
> SubString(GebyrNr,7,1)+
> SubString(GebyrNr,9,1)+
> SubString(GebyrNr,11,1) as int) as num
> From Gebyr
> Order by Cast(SubString(GebyrNr,1,1)+
> SubString(GebyrNr,3,1)+
> SubString(GebyrNr,5,1)+
> SubString(GebyrNr,7,1)+
> SubString(GebyrNr,9,1)+
> SubString(GebyrNr,11,1) as int)
Hjalp mig ikke så meget -> jeg får ikke noget output (jeg har selvfølgelig
skiftet tabelnavn og -felt ud med mine egne ). Andre ideer?
Venlig hilsen
Brian Emilius
| |
rpje (26-10-2004)
| Kommentar Fra : rpje |
Dato : 26-10-04 07:56 |
|
"Brian Emilius" skrev d. 25-10-04 18:11 dette indlæg :
> "rpje" <rpje.news@kandu.dk> skrev i en meddelelse
> news:417c2f34$0$174$edfadb0f@dtext02.news.tele.dk...
> > Select Cast(SubString(GebyrNr,1,1)+
> > SubString(GebyrNr,3,1)+
> > SubString(GebyrNr,5,1)+
> > SubString(GebyrNr,7,1)+
> > SubString(GebyrNr,9,1)+
> > SubString(GebyrNr,11,1) as int) as num
> > From Gebyr
> > Order by Cast(SubString(GebyrNr,1,1)+
> > SubString(GebyrNr,3,1)+
> > SubString(GebyrNr,5,1)+
> > SubString(GebyrNr,7,1)+
> > SubString(GebyrNr,9,1)+
> > SubString(GebyrNr,11,1) as int)
>
> Hjalp mig ikke så meget -> jeg får ikke noget output (jeg har
selvfølgelig
> skiftet tabelnavn og -felt ud med mine egne ). Andre ideer?
>
> Venlig hilsen
> Brian Emilius
>
>
Ok det virker godtnok hos mig, men her er så en anden måde at gøre det
på
Select Cast(REPLACE(GebyrNr,'_','') as int)as num
From Gebyr
Order by Cast(REPLACE(GebyrNr,'_','') as int)
MV
Peter Jensen
--
Leveret af:
http://www.kandu.dk/
"Vejen til en hurtig løsning"
| |
Brian Emilius (26-10-2004)
| Kommentar Fra : Brian Emilius |
Dato : 26-10-04 19:07 |
|
"rpje" <rpje.news@kandu.dk> skrev i en meddelelse
news:417df59c$0$169$edfadb0f@dtext02.news.tele.dk...
> men her er så en anden måde at gøre det
> på
> Select Cast(REPLACE(GebyrNr,'_','') as int)as num
> From Gebyr
> Order by Cast(REPLACE(GebyrNr,'_','') as int)
Virker heller ikke... Dette er hvad jeg skriver som sql-query:
SELECT CAST(REPLACE(id,'_','') as int) as num FROM nymenu ORDER BY
CAST(REPLACE(id,'_','') as int)
Og dette er fejlmeddelsen (i phpMyAdmin, men det gør vel ingen forskel):
#1064 - You have an error in your SQL syntax. Check the manual that
corresponds to your MySQL server version for the right syntax to use near
'int) as num FROM menu ORDER BY CAST(REPLACE(id,'_','') as int
Flere ideer?
Venlig hilsen
Brian Emilius
| |
Kristian Damm Jensen (26-10-2004)
| Kommentar Fra : Kristian Damm Jensen |
Dato : 26-10-04 08:23 |
|
"Brian Emilius" <msn@emilius.dk> wrote in message news:<cljc26$2d2p$1@news.cybercity.dk>...
> "rpje" <rpje.news@kandu.dk> skrev i en meddelelse
> news:417c2f34$0$174$edfadb0f@dtext02.news.tele.dk...
> > Select Cast(SubString(GebyrNr,1,1)+
> > SubString(GebyrNr,3,1)+
> > SubString(GebyrNr,5,1)+
> > SubString(GebyrNr,7,1)+
> > SubString(GebyrNr,9,1)+
> > SubString(GebyrNr,11,1) as int) as num
> > From Gebyr
> > Order by Cast(SubString(GebyrNr,1,1)+
> > SubString(GebyrNr,3,1)+
> > SubString(GebyrNr,5,1)+
> > SubString(GebyrNr,7,1)+
> > SubString(GebyrNr,9,1)+
> > SubString(GebyrNr,11,1) as int)
>
> Hjalp mig ikke så meget -> jeg får ikke noget output (jeg har selvfølgelig
> skiftet tabelnavn og -felt ud med mine egne ). Andre ideer?
Hvad mener du egentlig med at du ikke får noget output. De
SQL-systemer jeg kender giver altid *et eller andet*. Om ikke andet en
fejlmelding eller "0 rows selected" e.l.
Givet at der ikke er nogen where-klausul i forslaget forekommer det
forrykt, hvis du ikke får noget ud. Så må tabellen være tom!
P.S. Det ville være nemmere bare at lave "order by num" frem for a
skrive den komplekse cast flere gange.
Kristian
| |
Brian Emilius (26-10-2004)
| Kommentar Fra : Brian Emilius |
Dato : 26-10-04 19:11 |
|
"Kristian Damm Jensen" <damm@ofir.dk> skrev i en meddelelse
news:2c9e2992.0410252322.4c091434@posting.google.com...
> Hvad mener du egentlig med at du ikke får noget output. De
> SQL-systemer jeg kender giver altid *et eller andet*. Om ikke andet en
> fejlmelding eller "0 rows selected" e.l.
Du har selvfølgelig ret, der kommer en fejlmeddelelse.
> Givet at der ikke er nogen where-klausul i forslaget forekommer det
> forrykt, hvis du ikke får noget ud. Så må tabellen være tom!
Det er den ikke, men den er tilgengæld fuld af data
> P.S. Det ville være nemmere bare at lave "order by num" frem for a
> skrive den komplekse cast flere gange.
Har jeg også prøvet... Ingen ændring.
Andre ideer?
Venlig hilsen
Brian Emilius
| |
Jens Gyldenkærne Cla~ (26-10-2004)
| Kommentar Fra : Jens Gyldenkærne Cla~ |
Dato : 26-10-04 20:43 |
|
Brian Emilius skrev:
> Du har selvfølgelig ret, der kommer en fejlmeddelelse.
Hvilken?
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html
| |
Brian Emilius (27-10-2004)
| Kommentar Fra : Brian Emilius |
Dato : 27-10-04 14:09 |
|
"Jens Gyldenkærne Clausen" <jens@gyros.invalid> skrev i en meddelelse
news:Xns958EDCE55ADC6jcdmfdk@gyrosmod.cybercity.dk...
> Hvilken?
Undskyld, det har jeg lige glemt at skrive... kig lidt længere oppe i
tråden, der er dette beskrevet lidt nærmere...
Venlig hilsen
Brian Emilius
| |
Kristian Damm Jensen (26-10-2004)
| Kommentar Fra : Kristian Damm Jensen |
Dato : 26-10-04 20:54 |
|
Brian Emilius wrote:
<snip>
> Dette er hvad jeg skriver som sql-query:
> SELECT CAST(REPLACE(id,'_','') as int) as num FROM nymenu ORDER BY
> CAST(REPLACE(id,'_','') as int)
>
> Og dette er fejlmeddelsen (i phpMyAdmin, men det gør vel ingen
forskel):
Personligt ville jeg nok gå direkte til kilden. Hvert lag du lægger
ind imellem kan give anledning til problemer. Fx maltraktering af en
tom streng, eller i øvrigt af '-er.
> #1064 - You have an error in your SQL syntax. Check the manual that
> corresponds to your MySQL server version for the right syntax to use
near
> 'int) as num FROM menu ORDER BY CAST(REPLACE(id,'_','') as int
>
> Flere ideer?
Jeg ville nok prøve med successivt mere komplekse forespørgsler, for
at se, hvor problemet egentlig optræder:
Tomme strenge kan drille. Prøv
SELECT REPLACE(id,'_','X') FROM nymenu
Hvis det går godt, så prøv med
SELECT REPLACE(id,'_','') FROM nymenu
Så prøv at caste
SELECT CAST(REPLACE(id,'_','') as int) FROM nymenu
Kan evt. springes over, der er næppe noget her
SELECT CAST(REPLACE(id,'_','') as int) as num FROM nymenu
Og til slut
SELECT CAST(REPLACE(id,'_','') as int) as num FROM nymenu ORDER BY num
Venlig hilsen
Kristian
| |
Brian Emilius (27-10-2004)
| Kommentar Fra : Brian Emilius |
Dato : 27-10-04 14:10 |
|
"Kristian Damm Jensen" <damm@ofir.dk> skrev i en meddelelse
news:1098820452.618288.162730@z14g2000cwz.googlegroups.com...
>Jeg ville nok prøve med successivt mere komplekse forespørgsler, for
>at se, hvor problemet egentlig optræder:
- god ide, det prøver jeg lige :)
>Tomme strenge kan drille. Prøv
>SELECT REPLACE(id,'_','X') FROM nymenu
Returnerer helt korrekt dataene i tabellen, blot med 'X' istedet for '_'.
>Hvis det går godt, så prøv med
>SELECT REPLACE(id,'_','') FROM nymenu
Virker også fint, blot ingenting i stedet for '_'.
>Så prøv at caste
>SELECT CAST(REPLACE(id,'_','') as int) FROM nymenu
FEJL: #1064 - You have an error in your SQL syntax. Check the manual that
corresponds to your MySQL server version for the right syntax to use near
'int) FROM nymenu LIMIT 0, 30' at line 1
>Kan evt. springes over, der er næppe noget her
>SELECT CAST(REPLACE(id,'_','') as int) as num FROM nymenu
FEJL: #1064 - You have an error in your SQL syntax. Check the manual that
corresponds to your MySQL server version for the right syntax to use near
'int) as num FROM nymenu LIMIT 0, 30' at line 1
>Og til slut
>SELECT CAST(REPLACE(id,'_','') as int) as num FROM nymenu ORDER >BY num
FEJL: #1064 - You have an error in your SQL syntax. Check the manual that
corresponds to your MySQL server version for the right syntax to use near
'int) as num FROM nymenu ORDER BY num LIMIT 0, 30' at line 1
Hjælper dette med løsningeng på problemet?
Venlig hilsen
Brian Emilius
| |
Jens Gyldenkærne Cla~ (27-10-2004)
| Kommentar Fra : Jens Gyldenkærne Cla~ |
Dato : 27-10-04 14:36 |
|
Brian Emilius skrev:
>>SELECT CAST(REPLACE(id,'_','') as int) FROM nymenu
>
> FEJL: #1064 - You have an error in your SQL syntax. Check the manual that
> corresponds to your MySQL server version for the right syntax to use near
> 'int) FROM nymenu LIMIT 0, 30' at line 1
O.k. - der er noget i ovenstående linje som parseren ikke kan tolke
korrekt. Formentlig er det datatypen "int" der ikke genkendes.
Hvis jeg læser følgende manualside korrekt, forstår CAST ikke int, men i
stedet SIGNED eller UNSIGNED
(< http://dev.mysql.com/doc/mysql/en/Cast_Functions.html>)
Prøv med
SELECT CAST(REPLACE(id,'_','') AS SIGNED) FROM nymenu
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html
| |
claesdamlund (27-10-2004)
| Kommentar Fra : claesdamlund |
Dato : 27-10-04 20:09 |
|
I replacer en underscore ('_') med en tom tekst ('') og prøver at caste
den til en int - en tom tekst kan ikke castes til en int. Prøv i stedet
Cast(Replace(id,'_','0') as int). Hvis du sorterer på alle dine værdier
hvor underscores er erstattet med et 0, burde du få den rigtige
rækkefølge.
Claes Damlund
--
Leveret af:
http://www.kandu.dk/
"Vejen til en hurtig løsning"
| |
Brian Emilius (27-10-2004)
| Kommentar Fra : Brian Emilius |
Dato : 27-10-04 22:18 |
|
"claesdamlund" <claesdamlund.news@kandu.dk> skrev i en meddelelse
news:417ff2f9$0$167$edfadb0f@dtext02.news.tele.dk...
>I replacer en underscore ('_') med en tom tekst ('') og prøver at caste
> den til en int - en tom tekst kan ikke castes til en int. Prøv i stedet
> Cast(Replace(id,'_','0') as int).
Jeg har prøvet at replace med mange forskellige tegn nu, og ingen af dem
virker med int, men kun med SIGNED.
> Hvis du sorterer på alle dine værdier
> hvor underscores er erstattet med et 0, burde du få den rigtige
> rækkefølge.
Nej! for så bliver 2_1 til 201 og kommer derfor ikke lige efter 1 og lige
før 3...
Venlig hilsen
Brian Emilius
| |
Jens Gyldenkærne Cla~ (28-10-2004)
| Kommentar Fra : Jens Gyldenkærne Cla~ |
Dato : 28-10-04 10:06 |
|
claesdamlund skrev:
> I replacer en underscore ('_') med en tom tekst ('') og prøver at caste
> den til en int
Nej - prøv at læse det første indlæg igen. Id-feltet indeholder værdier
som 1, 2_1, 2_2 etc. Hvis man fjerner _ fra værdierne kan de fint tolkes
som heltal. Kun hvis id-feltet kan være tomt (eller kun bestå af _), vil
erstatningen give fejl.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html
| |
|
|