/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
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

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

Søg
Reklame
Statistik
Spørgsmål : 177460
Tips : 31964
Nyheder : 719565
Indlæg : 6408201
Brugere : 218881

Månedens bedste
Årets bedste
Sidste års bedste