[sql] string sorteren

Pagina: 1
Acties:

  • Tinuske
  • Registratie: September 2002
  • Laatst online: 08-02 20:43
Ik heb een veld in een tabel (type = string) , welke nummers met punten daartussen bevat, bijv: (zie het als een soort versienummers)

1.0.0.11
3.0
2.5.6.1
4.7.9.1.10
etc.

Nu wil ik als ik een combobox vul, deze sorteren op volgorde

Dat werkt in principe goed, totdat er getallen boven de 9 worden gebruikt, dat wordt dan

2.2.9
2.2.6
2.2.10
1.9.0


moet natuurlijk zijn
2.2.10
2.2.9
2.2.6 enz.

(hoogste nummer moet bovenaan komen)

Ik zou bijv 5 kolommen kunnen gaan maken als integer. Dan zou het sorteren geen problemen opleveren. Maar nu werkt het dus niet, omdat het een string is en deze puur naar het 1e karakter kijkt elke keer en daarop sorteert.

Is er een mogelijkheid om het veld als string te laten, maar toch een goede sortering te krijgen ?

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 26-05 17:50

gorgi_19

Kruimeltjes zijn weer op :9

Voorloopnullen gebruiken bij het sorteren?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Tinuske
  • Registratie: September 2002
  • Laatst online: 08-02 20:43
gorgi_19 schreef op 08 april 2004 @ 15:59:
Voorloopnullen gebruiken bij het sorteren?
Om eerlijk te zeggen snap ik niet wat je bedoeld. Kun je bovenstaande verduidelijken. Misschien met een voorbeeld ?

Verwijderd

ik denk dat ie dit bedoelt:

2.2.10
2.2.09
2.2.06
1.9.00

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 26-05 17:50

gorgi_19

Kruimeltjes zijn weer op :9

Tinuske schreef op 08 april 2004 @ 16:03:
[...]


Om eerlijk te zeggen snap ik niet wat je bedoeld. Kun je bovenstaande verduidelijken. Misschien met een voorbeeld ?
Verwijderd schreef op 08 april 2004 @ 16:06:
ik denk dat ie dithij bedoelt:

2.2.10
2.2.09
2.2.06
1.9.00
:P

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • ripexx
  • Registratie: Juli 2002
  • Laatst online: 23:18

ripexx

bibs

Als je niet het model wil aanpassen kan je de string natuurlijk ook splitsen en dan sorteren op de verschillende onderdelen. Ik weet alleen niet of je dan de string kan converteren naar een integer want anders heb je er niet veel aan. Om welke (R)DBMS gaat het want ze hebben niet allemaal dezelfde functies.

buit is binnen sukkel


  • Tjark
  • Registratie: Juni 2000
  • Laatst online: 26-05 16:59

Tjark

DON'T PANIC

misschien niet sorteren in SQL maar in je programmeertaal/scripttaal? (Met een natural sort oid)

*insert signature here


Verwijderd

waarom maar je er geen number waarde van? dan gaat het volgens mij wel goed

  • ripexx
  • Registratie: Juli 2002
  • Laatst online: 23:18

ripexx

bibs

Verwijderd schreef op 08 april 2004 @ 16:16:
waarom maar je er geen number waarde van? dan gaat het volgens mij wel goed
Hoe zie je dat dan voor je.
2.4.46
2.4.9
2.4.10
Het zijn geen duizend tallen en ik ken geen getallen met een dubbele comma/punt notatie.
Het enige is een natural sort of heel erg gaan lopen klooien in sql, dan maar een natural sort ;)

buit is binnen sukkel


  • Tinuske
  • Registratie: September 2002
  • Laatst online: 08-02 20:43
Het is een mssql database.
Ik wil eigenlijk die sortering in de stored procedure al in orde maken.
nu is het iets van

code:
1
 select versienummer from versie order by versienummer

versienummer heeft als type varchar(50)

ik zou die voorloopnullen kunnen gebruiken
maar het versienummer kan ook zoiets zijn van 255.2.5
dat zou betekenen dat ik iets als 1.0.0 al met 2 verloopnullen moet opslaan , en je straks dus wellicht iets krijgt van 0003.0005.003.0006
niet echt overzichtelijk meer.

Het versienummer wordt gekozen uit een combobox die wordt gekoppeld aan het resultaat van de sql-procedure. Is er een mogelijkheid om dit in de stored procedure op te lossen ?

Verwijderd

o ja natuurlijk had ik ff niet aan gedacht |:( dan zou ik het eerst in een array zetten met de split functie en dan door middel van een loopje sorteren.

Verwijderd

Ik lees getallen en niet getallen apart in. Dus getallen aan elkaar geldt als lengte +1. Aan de hand daarvan bepaal ik de totale lengte van de string. Dan sorteer ik aan de hand van de kortste string.

Zo kun je eenvoudig strings met getallen sorteren (tenminste zo doe ik het en werkt prima).

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Als je weet wat het grootste getal is tussen twee punten dan kun je in MSSQL 2000 mbv een user defined function vrij eenvoudig een tijdelijke string maken waarin voorloopnullen staan.
Binnen je stored procedure kun je dan op deze waarde sorteren.
Je originele string kun je dan ook nog steeds teruggeven in de resultset, zodat de gebruiker dus niet van al die voorloopnullen ziet.

Never underestimate the power of


  • davhor
  • Registratie: Mei 2003
  • Laatst online: 02-12-2025

davhor

www.fon.com

En het allermakkelijkste en minst mooie is het sorteren op de kolom ID.

Ik neem aan als er een nieuwe versie wordt ingevoerd dat deze standaard bovenaan komt, dus ook het hoogste ID heeft.

FON - WiFi for Everyone | Flickr


  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
davhor schreef op 08 april 2004 @ 17:14:
En het allermakkelijkste en minst mooie is het sorteren op de kolom ID.

Ik neem aan als er een nieuwe versie wordt ingevoerd dat deze standaard bovenaan komt, dus ook het hoogste ID heeft.
Dat is erg gevaarlijk. Zoiets moet je echt nooit doen.

Never underestimate the power of


  • Tinuske
  • Registratie: September 2002
  • Laatst online: 08-02 20:43
cameodski schreef op 08 april 2004 @ 16:55:
Als je weet wat het grootste getal is tussen twee punten dan kun je in MSSQL 2000 mbv een user defined function vrij eenvoudig een tijdelijke string maken waarin voorloopnullen staan.
Binnen je stored procedure kun je dan op deze waarde sorteren.
Je originele string kun je dan ook nog steeds teruggeven in de resultset, zodat de gebruiker dus niet van al die voorloopnullen ziet.
Hmm, dat klinkt als de ideale oplossing.
Heb je misschien een voorbeeld of een goede link ? (met google krijg ik hierover niet veel gevonden nml.)

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Tinuske schreef op 09 april 2004 @ 09:21:
Hmm, dat klinkt als de ideale oplossing.
Heb je misschien een voorbeeld of een goede link ? (met google krijg ik hierover niet veel gevonden nml.)
In Books Online (zit bij MSSQL) even zoeken op CREATE FUNCTION en je krijgt uitleg en ook voorbeelden.

Never underestimate the power of


  • d00d
  • Registratie: September 2003
  • Laatst online: 16-09-2025

d00d

geen matches

Hoi Tinuske,

Je geeft zelf eigenlijk al aan dat je ook 5 kolommen kunt maken met de verschillende elementen van het versie nummer, ik denk dat je hier inderdaad niet omheen komt.

Als je de tabel als volgt aanmaakt dan ben je al een eind op weg

CREATE TABLE [dbo].[Version] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[F1] [int] NULL ,
[F2] [int] NULL ,
[F3] [int] NULL ,
[F4] [int] NULL ,
[F5] [int] NULL ,
[version] AS (case when ([F1] is null) then '' else (convert(varchar(10),[F1])) end + case when ([F2] is null) then '' else ('.' + convert(varchar(10),[F2])) end + case when ([F3] is null) then '' else ('.' + convert(varchar(10),[F3])) end + case when ([F4] is null) then '' else ('.' + convert(varchar(10),[F4])) end + case when ([F5] is null) then '' else ('.' + convert(varchar(10),[F5])) end)
)

De version kolom wordt nu een computed column en je kunt de versie sorteren dmv:

select version from version order by f1, f2, f3, f4, f5
select version from version order by f1 desc, f2 desc, f3 desc, f4 desc, f5 desc

hope this helps,
Daniel

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

Pagina: 1