Toon posts:

[SQL, Delphi] Query resultaat sorteren

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik wil bij een query het resultaat gesorteerd hebben op 1 veld (positie). Normaal gesproken doe je dat dus gewoon via:

ORDER BY POSITIE


Het resultaat van de query wordt gevuld in een ListView. Alleen er moet als volgt gesorteerd worden:

eerst 0, 1, 2, 3, 4, 5, enz... en dan alle records met -1


Is dit mogelijk in SQL of moet ik alle records met positie -1 tijdelijk ergens bewaren en nadat ik alle records met > 0 toegevoegd heb, die ook toevoegen?

  • jopiek
  • Registratie: September 2000
  • Laatst online: 21-08 19:56

jopiek

Tja... 'ns ff denken.

a. delphi zal ergens SQL op it moeten voeren, het is geen delphi issue maar de betreffende DB...

b. ik denk dat het wel wil met ORDER BY POSITIE DESC

c. testen is in dit geval DE manier om zoiets op te lossen...

Cogito Ergo Credo


Verwijderd

Topicstarter
Op zondag 14 juli 2002 10:41 schreef jopiek het volgende:
ik denk dat het wel wil met ORDER BY POSITIE DESC
Nee, want dan zou je bijv 5, 4, 3, 2, 1, 0, -1, -1, -1 krijgen
c. testen is in dit geval DE manier om zoiets op te lossen...
Ja dan moet je dus wel weten hoe het moet. En ik vraag het dus eerst of het wel mogelijk is met SQL.

  • jopiek
  • Registratie: September 2000
  • Laatst online: 21-08 19:56

jopiek

Tja... 'ns ff denken.

Op zondag 14 juli 2002 10:45 schreef tokkie het volgende:

[..]

Nee, want dan zou je bijv 5, 4, 3, 2, 1, 0, -1, -1, -1 krijgen
[..]

Ja dan moet je dus wel weten hoe het moet. En ik vraag het dus eerst of het wel mogelijk is met SQL.
oh, sorry, dacht ff niet goed genoeg na... volgens mij is het onmogelijk om met normale SQL dit voor elkaar te krijgen, je zou wel een extra tijdelijke indexering kunnen maken die je aan de hand van de positie laat genereren, is niet mooi maar werkt wel:

5|1
4|2
3|3
2|4
1|5
0|6
-1|7
-1|8
-1|9

Cogito Ergo Credo


Verwijderd

Topicstarter
Ik heb nog even met iemand overlegd en die had gewoon een hele simpele oplossing: 2 query's gebruiken.

1) select .... from .... where positie >= 0 order by positie

2) select .... from .... where positie < 0

  • jopiek
  • Registratie: September 2000
  • Laatst online: 21-08 19:56

jopiek

Tja... 'ns ff denken.

idd zou ook kunnen en dan die twee queries joinen, had ik niet aan gedacht, is bij SQL vaak, gewoon klooien om tot een resultaat te komen...

Cogito Ergo Credo


Verwijderd

Dan zal je twee results aan elkaar moeten plakken (binnen 1 query).
Dat is mogelijk met UNION. Check ff een help om erachter te komen hoe dat precies zit.

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

select .... from .... where positie >= 0 order by positie
union
select .... from .... where positie < 0

dat zou kunnen werken inderdaad

maar de query zal niet editable zijn

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Topicstarter
Op zondag 14 juli 2002 17:35 schreef LordLarry het volgende:
maar de query zal niet editable zijn
Dat geeft niet. De query is alleen maar om een listview te kunnen vullen. Dus hij wordt alleen maar uitgelezen.

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Je kan het ook in 1 query doen, maar dan moet je een if in je select kunnen plaatsen.

Krijg je iets als:
select ...., if(veldje >= 0){ veldje} else { 1000000} as orderer where .... order by orderer

Met uiteraard de goede syntax voor jouw database.

  • Delphi32
  • Registratie: Juli 2001
  • Laatst online: 31-08 21:58

Delphi32

Heading for the gates of Eden

Op zondag 14 juli 2002 17:50 schreef tokkie het volgende:

[..]

Dat geeft niet. De query is alleen maar om een listview te kunnen vullen. Dus hij wordt alleen maar uitgelezen.
Als je de ListView met de hand gaat vullen (maw als het geen data-aware ListView is), dan is de sortering toch een client-side probleempje? Het is toch niet perse noodzakelijk om dit server-side op te lossen door een zeer onefficiente UNION te gaan gebruiken?

Als je ListView wel data-aware is, dan zit er idd niets anders op dan een UNION.

Verwijderd

Topicstarter
Op zondag 14 juli 2002 20:31 schreef Delphi32 het volgende:
Als je de ListView met de hand gaat vullen (maw als het geen data-aware ListView is), dan is de sortering toch een client-side probleempje?
Het is inderdaad geen data-aware component en precies wat jij zegt zou dat natuurlijk client-side moeten worden opgelost.

Dus maar ff kijken hoe het sorteren precies werkt in een ListView....

Bedankt.

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Met een normaal DBMS kan je met een UNION geen volgorde afdwingen. De enige manier is met een order by. En dan kom je uit op de manier van ACM. Een if statement in je query. Je kan die IF opnemen in je select-clause en dan op dat veld sorteren of je kan de IF opnemen in de ORDER BY clause.

Verwijderd

Op zondag 14 juli 2002 18:32 schreef ACM het volgende:
Je kan het ook in 1 query doen, maar dan moet je een if in je select kunnen plaatsen.

Krijg je iets als:
select ...., if(veldje >= 0){ veldje} else { 1000000} as orderer where .... order by orderer

Met uiteraard de goede syntax voor jouw database.
hmm, iets officieler: select ..., if(statement, true, false) as ordener where .... order by ordener.

Bij mijn weten is dat een wat algemenere versie.

  • Delphi32
  • Registratie: Juli 2001
  • Laatst online: 31-08 21:58

Delphi32

Heading for the gates of Eden

Op zondag 14 juli 2002 18:32 schreef ACM het volgende:
Je kan het ook in 1 query doen, maar dan moet je een if in je select kunnen plaatsen.

Krijg je iets als:
select ...., if(veldje >= 0){ veldje} else { 1000000} as orderer where .... order by orderer

Met uiteraard de goede syntax voor jouw database.
Helaas, topicstarter werkt met Interbase 6.0 en daar kan je dus geen IFjes doen.
Maar dat is toch ook helemaal geen ANSI SQL standaard? Of heb ik iets gemist?

Verwijderd

Topicstarter
Ik heb inmiddels de volgende code gemaakt voor de sortering:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
procedure TFormBestelboekSchappenVolgorde.ListViewBestelboekSchappenVolgordeCompare(
  Sender: TObject; Item1, Item2: TListItem; Data: Integer;
  var Compare: Integer);
begin
  if (StrtoInt(Item1.SubItems[0]) = -1) then
  begin
    if (StrtoInt(Item2.SubItems[0]) <> -1) then
    Compare := 1
    else
    Compare := 0;
  end
  else
  begin
    if (StrtoInt(Item2.SubItems[0]) = -1) then
    Compare := -1
    else
    begin
    if StrtoInt(Item1.SubItems[0]) < StrtoInt(Item2.SubItems[0]) then
      Compare := -1
    else
      if StrtoInt(Item1.SubItems[0]) = StrtoInt(Item2.SubItems[0]) then
        Compare := 0
      else
        Compare := 1;
    end;
  end;
end;

Maar de volgorde komt niet goed in de ListView te staan.

Wat is er fout aan deze code?

(De volgorde moet zijn eerst >= 0 en dan alle items met -1 ==> 0, 1, 2, 3, 4, -1, -1, -1)


edit:


|:( Laat maar ik heb het al opgelost. Het is namelijk wel handig om de goede kolom met de juiste waarde te pakken!

Pagina: 1