Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[MySQL] CAST() en CONVERT() sorteren niet goed ?

Pagina: 1
Acties:

  • mcdronkz
  • Registratie: Oktober 2003
  • Laatst online: 16-04 12:44
Ik heb een paar tabelletjes gemaakt waarmee ik probeer een overzicht te scheppen in het gereedschap dat ik heb. Nu is veruit de belangrijkste tabel "gereedschap_item". Hierin staan gegevens als het merk, het artikelnummer (meteen ook de primary key) en de maat.

Nu wil ik dus steeksleutels kunnen sorteren op maat, maar er is één probleem: het zijn niet "zomaar" getallen.

De maat is een varchar, omdat je praat over 6x7, 8x9, 10x11, 12x13 enz. enz. Als ik dit ga sorteren staan 6x7 en 8x9 natuurlijk onderaan (terwijl de grotere maten dus bovenaan staan).

Even voor de duidelijkheid, het moet als volgt gesorteerd worden:

code:
1
2
3
4
5
6
7
iMaat
--------
6x7
8x9
10x11
12x13
14x15


Opzich zou dit moeten kunnen als je het veld gaat casten/converten als SIGNED. Ik krijg dan ook netjes de goede volgorde te zien met de volgende query:

SQL:
1
SELECT iMerk, iArtikelNr, iMaat FROM gereedschap_item ORDER BY CONVERT(iMaat, SIGNED);


Totdat ik dit doe:

SQL:
1
SELECT iMerk, iArtikelNr, iMaat FROM gereedschap_item ORDER BY iMerk, iArtikelNr, CONVERT(iMaat, SIGNED);


Dan sorteert 'ie wel op merk en artikelnummer, maar niet meer op de maat. Het lijkt er dus op dat cast/convert niet echt multi-column sort compatible zijn ofzo. In de manual heb ik hier niets over kunnen vinden, en met google kwam ik ook niet veel verder.

Heeft er iemand enig idee wat hier aan de hand is ?

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Zet het eens in je select, zodat je kan zien of het resultaat van die functies wel klopt.

{signature}


  • thomaske
  • Registratie: Juni 2000
  • Laatst online: 14-11 08:44

thomaske

» » » » » »

Wat als je de CONVERT ook in de SELECT opneemt?

SQL:
1
2
3
SELECT iMerk, iArtikelNr, CONVERT(iMaat, SIGNED) 
FROM gereedschap_item 
ORDER BY iMerk, iArtikelNr, CONVERT(iMaat, SIGNED);

Brusselmans: "Continuïteit bestaat niet, tenzij in zinloze vorm. Iets wat continu is, is obsessief, dus ziekelijk, dus oninteressant, dus zinloos."


  • Ascathon
  • Registratie: Augustus 2004
  • Laatst online: 11:41
SQL:
1
2
3
SELECT iMerk, iArtikelNr, CONVERT(iMaat, SIGNED) AliasHier
FROM gereedschap_item 
ORDER BY AliasHier;

Edit: ff aangepast...Als je op die maat wilt sorteren, dan moet je de rest natuurlijk niet meenemen.

[ Voor 34% gewijzigd door Ascathon op 28-03-2008 18:21 ]


  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Is het probleem niet gewoon dat hij eerst op artikelnr gesorteerd wordt, omdat dit een prim key is zijn er geen duplicaten dus gaat hij nooit op imaat sorteren ( doet hij pas iartikelnr dubbel is )

  • mcdronkz
  • Registratie: Oktober 2003
  • Laatst online: 16-04 12:44
thomaske schreef op vrijdag 28 maart 2008 @ 16:22:
Wat als je de CONVERT ook in de SELECT opneemt?

SQL:
1
2
3
SELECT iMerk, iArtikelNr, CONVERT(iMaat, SIGNED) 
FROM gereedschap_item 
ORDER BY iMerk, iArtikelNr, CONVERT(iMaat, SIGNED);
Dan veranderd er niets (wat sorteren betreft).
Gomez12 schreef op vrijdag 28 maart 2008 @ 17:25:
Is het probleem niet gewoon dat hij eerst op artikelnr gesorteerd wordt, omdat dit een prim key is zijn er geen duplicaten dus gaat hij nooit op imaat sorteren ( doet hij pas iartikelnr dubbel is )
Hmm, ja, dan sorteert 'ie in elk geval op iMerk, en daarna op iMaat.

En sterker nog, hij sorteert dan ook wel op iArtikelNr, dwz. dat de 916SP onder de 450N komt te staan (zoals het hoort), maar dan pakt 'ie die maten verkeerd en komen 6x7 en 8x9 alsnog onderaan te staan.

Oftewel: het sorteren gaat dan wel, maar hij pakt dat CONVERT() gebeuren niet.

Verwijderd

Hoe dacht je dat CONVERT() een '6x7' string zou moeten converteren naar een signed int???
Als 6 * 7? Dat zul je toch echt zelf moeten doen, met SUBSTR() en LOCATE() als je hulpjes...
Pagina: 1