Toon posts:

[SQL] Sort complex string

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb de bijvoorbeeld de waarde 1248/08

Hierin staat 08 voor het jaar, dat terug kan gaan naat bijv 96 voor 1996.
De eerste twee karakters staan voor de maand.
En karakters nummer 3 en 4 (in voorbeeld 48) is een oplopende waarde.

Graag wil ik hier op soteren in de volorde van jaar, dan maand en als laatste het volgnummer. ;(

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 22:12

Creepy

Tactical Espionage Splatterer

En wat heb je zelf al geprobeerd? Een vraag dumpen zonder zelf wat geprobeerd of gezocht te hebben en wachten op een oplossing is niet de bedoeling ;)

Je zult aan de slag moeten met wat string functies om zo de juiste zaken eruit te halen (het jaar) en hierop te gaan sorteren. Beter is het natuurlijk om een type te gebruiken dat ervoor bedoeld is (een datetime bijv, of als je alleen een jaartal opslaat een integer o.i.d.) en de representatie naar de gebruiker buiten je database te houden.

[ Voor 5% gewijzigd door Creepy op 12-06-2009 14:34 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • winkbrace
  • Registratie: Augustus 2008
  • Laatst online: 24-08 15:17
Ook is het handig om te vertellen in welke database je werkt. Vooral date functies verschillen namelijk nogal per database.

Toch nog een hint:
SQL:
1
select substr(kolom, -2) from tabel

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Leek me wel eigenlijk. Zo niet weten wat je met de informatie moet wat wat ik allemaal al heb gedaan. Snap ook niet hoe dat het antwoord gaat veranderen.(lijkt mij dat het forum antwoorden moet gaan leveren). En geen discussie moet gaan opleveren over mijn levensverhaal.

Aan de waarde te zien kan je er van uitgaan dat ik heb niet heb bedacht en voor de eindgebruiker het miss handiger is om hem zo te houden. De manipulatie buiten de database (dus er ook heen) zie ik al helemaal niet zitten.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
O BazzPsychoNut ja sorry het is MS 2008

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 22:12

Creepy

Tactical Espionage Splatterer

Verwijderd schreef op vrijdag 12 juni 2009 @ 14:52:
Leek me wel eigenlijk. Zo niet weten wat je met de informatie moet wat wat ik allemaal al heb gedaan. Snap ook niet hoe dat het antwoord gaat veranderen.(lijkt mij dat het forum antwoorden moet gaan leveren). En geen discussie moet gaan opleveren over mijn levensverhaal.
Het geeft ons meer inzicht in waarom je iets doet. Scheelt je weer een hoop vragen beantwoorden over het hoe en waarom. Het laat ook gelijk zien dat je geen helpdesker bent en wel degelijk bezig bent geweest met je probleem. Ook voorkomt het oplossingen die je zelf al hebt geprobeerd en die niet werken voor jou.
Aan de waarde te zien kan je er van uitgaan dat ik heb niet heb bedacht en voor de eindgebruiker het miss handiger is om hem zo te houden. De manipulatie buiten de database (dus er ook heen) zie ik al helemaal niet zitten.
Dat had je bijv. al direct kunnen melden in je startpost ;)

Dus: kan je wat met het substring gebeuren en daarmee sorteren of niet? (dus substring e.d. in je query gebruiken om zo je database de sortering te laten doen)

[ Voor 4% gewijzigd door Creepy op 12-06-2009 15:04 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ORDER BY SUBSTRING(p.deWaarde,6,1) Desc
, SUBSTRING(p.deWaarde,7,1) + SUBSTRING(p.deWaarde,1,2) + SUBSTRING(deWaarde,3,2) ASC

Het werkt tijdelijk wel maar is niet netjes. want dit gaat in 2010 natuurlijk mis. Iemand een ander idee????

En het verplicht je een TOP in te stellen.

[ Voor 8% gewijzigd door Verwijderd op 12-06-2009 15:48 ]


Acties:
  • 0 Henk 'm!

  • user109731
  • Registratie: Maart 2004
  • Niet online
Functie zoeken om string om te zetten naar timestamp ofzo, en daarop sorteren.
Dit is sowieso geen handig formaat voor een database...

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dank je, jan

Acties:
  • 0 Henk 'm!

  • cariolive23
  • Registratie: Januari 2007
  • Laatst online: 18-10-2024
Sorteren op een waarde die je eerst met een functie moet gaan opstellen, kan gruwelijk langzaam zijn. Er is namelijk geen index beschikbaar. Wanneer je hooguit enkele tientallen records hebt, zal het niet uitmaken, maar met een paar duizend records maakt het ontbreken van een index een enorm verschil.

Tip: Zet de gewenste sorteervolgorde in de tabel en maak een index op deze kolom. Kan de query zomaar 1000x sneller van worden. Gebruik EXPLAIN om de verschillen in snelheid en uitvoering goed te kunnen zien.

Ps. Wanneer je niet iedere zelf met de hand deze waarde wilt gaan vaststellen, maak dan even een trigger aan die dit voor jou regelt.

Acties:
  • 0 Henk 'm!

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
cariolive23 schreef op vrijdag 12 juni 2009 @ 17:18:
Sorteren op een waarde die je eerst met een functie moet gaan opstellen, kan gruwelijk langzaam zijn. Er is namelijk geen index beschikbaar. Wanneer je hooguit enkele tientallen records hebt, zal het niet uitmaken, maar met een paar duizend records maakt het ontbreken van een index een enorm verschil.
In sommige databases (Firebird bijvoorbeeld) kan je een index maken op basis van functies. Dan komen de 'kosten' van een dergelijke functie dus voornamelijk bij individuele inserts en updates (en zijn dan dus relatief laag).

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Verwijderd schreef op vrijdag 12 juni 2009 @ 14:52:
Aan de waarde te zien kan je er van uitgaan dat ik heb niet heb bedacht en voor de eindgebruiker het miss handiger is om hem zo te houden.
Toch kan je het beste je datamodel verbeteren, met indien gewenst gelijkblijvende i/o richting gebruiker. :)

[ Voor 3% gewijzigd door Voutloos op 15-06-2009 11:04 ]

{signature}


Acties:
  • 0 Henk 'm!

  • cariolive23
  • Registratie: Januari 2007
  • Laatst online: 18-10-2024
Remus schreef op maandag 15 juni 2009 @ 10:54:
[...]

In sommige databases (Firebird bijvoorbeeld) kan je een index maken op basis van functies.
Dat kan gelukkig in vele databases, maar ik had er even niet aan gedacht... :? Ik gebruik zelf PostgreSQL, die kent dit ook.

Daarnaast heb ik de indruk dat het hier gaat om MySQL, geen idee waarom ik de plank zo mis sloeg 8)7 , en die kent geen functionele indexen. Vele eenvoudige zaken bestaan niet in MySQL, die wielen mag je allemaal zelf gaan uitvinden. En dan moet je dus met triggers aan de slag, extra kolommen en daar een index op zetten.

[ Voor 2% gewijzigd door cariolive23 op 15-06-2009 12:11 . Reden: MS 2008, het staat er zelfs in.... Goed lezen is ook een vak 8)7 ]


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Een functionele index is hier enkel 1 van de mogelijke pleisters. Het echte probleem is het datamodel., en die kan je ook in mysql beter krijgen.
[/tegen beter weten ingaan op offtopic mysql rants]

[ Voor 15% gewijzigd door Voutloos op 15-06-2009 12:49 ]

{signature}


Acties:
  • 0 Henk 'm!

  • d00d
  • Registratie: September 2003
  • Laatst online: 16-09 13:23

d00d

geen matches

Ok, eigenlijk zou je <vul hier de opmerking over design in>, maar soms moet je werken met wat je hebt.
Dit zou moeten werken (ook na 2010):

SQL:
1
2
3
4
5
order by
case when CONVERT(int, right(v, 2)) > YEAR(CURRENT_TIMESTAMP) % 100
 then '0' + RIGHT(v, 2) + LEFT(v, 4)
 else '1' + RIGHT(v, 2) + LEFT(v, 4)
 end desc

42.7 percent of all statistics are made up on the spot.

Pagina: 1