Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   "Case" "Order By Nulls First" und Substring -> falsche Sortierung (https://www.delphipraxis.net/203216-case-order-nulls-first-und-substring-falsche-sortierung.html)

hoika 24. Jan 2020 10:43

Datenbank: FB • Version: 2 • Zugriff über: IBDAC

"Case" "Order By Nulls First" und Substring -> falsche Sortierung
 
Hallo,
ich habe hier einen merkwürdigen Fall.
Erst mal der Hintergrund.
Ich will einen Report erstellen, sortiert nach dem Quartal.
Das Feld hat folgendes Format QJJJJ (Q=Quartal, J=vierstelliges Jahr).

Also z.B.
42019
12020

Und nun kommts.
Es gibt auch Dummy-Datensätze, da steht nur ein "I" drin.
Ändern kann ich das nicht, ich muss damit leben.

Diese I's will ich ganz oben haben.

Ich habe dann überlegt.

SQL1:

Select Feld
From Tabelle
Order By substring(1 from 2 for 4)||substring(1 from 1 for 1)
Jetzt steht das I ganz unten, die Quartale sind aber korrekt eingeordnet.

SQL2:
Es gibt ja Nulls First, also
Select
case Feld
when "I" then NULL
else Feld
end
From Tabelle
Order By substring(1 from 2 for 4)||substring(1 from 1 for 1) Nulls First


Klappt nicht, die Null-Werte stehen ganz unten

Meine Notlösung
SQL3:
Select * From
(
Select
case Feld
when "I" then NULL
else Feld as SuchFeld
end
From Tabelle
Order By substring(1 from 2 for 4)||substring(1 from 1 for 1)
)
Order By SuchFeld Nulls First


Nicht schön, aber warum klappt SQL2 nicht?
Laut Doku liefert substring(NULL) NULL zurück
und NULL||NULL ist auch NULL.
Das ist auch tatsächlich so.

SQL3 reicht ja erst mal, aber SQL2 gefällt mir besser.

jobo 24. Jan 2020 10:48

AW: "Case" "Order By Nulls First" und Substring -> falsche Sortierung
 
Wieso konkatenierst Du den gesamten ORDER BY Ausdruck?
Mach doch order by für einzelne Substrings und nutze asc, desc.

alex517 24. Jan 2020 11:29

AW: "Case" "Order By Nulls First" und Substring -> falsche Sortierung
 
ich baue mir dazu immer "Sortierfelder".


hier mit deinem Ansatz mit NULLS First
Code:
select
  IIF(TAB2.QUARTAL='I', null, substring(TAB2.QUARTAL from 2 for 4)||substring(TAB2.QUARTAL from 1 for 1)) SortFeld,
  TAB2.QUARTAL
from
  TAB2

order by
  SortFeld nulls first


oder mit voranstellen eines Präfixes

Code:
select
  IIF(TAB2.QUARTAL='I', 1, 2) || substring(TAB2.QUARTAL from 2 for 4)||substring(TAB2.QUARTAL from 1 for 1) SortFeld,
  TAB2.QUARTAL
from
  TAB2

order by
  SortFeld
oder mit separaten Sortierfeldern

Code:

select
  IIF(TAB2.QUARTAL='I', 0, 1) SortFeld1,
  substring(TAB2.QUARTAL from 2 for 4)||substring(TAB2.QUARTAL from 1 for 1) SortFeld2,
  TAB2.QUARTAL
from
  TAB2

order by
  SortFeld1,
  SortFeld2

hoika 24. Jan 2020 12:01

AW: "Case" "Order By Nulls First" und Substring -> falsche Sortierung
 
Hallo,
danke

Mach doch order by für einzelne Substrings und nutze asc, desc.
Damit wird trotzdem das "I" falsch einsortiert.

IIF
Das gibt es leider erst ab FB2.1.


Halt:
Gibt es ab FB2.0!
Und damit klappt das wie Schnürchen.

Vielen Dank an alle (beiden).

Jumpy 25. Jan 2020 10:56

AW: "Case" "Order By Nulls First" und Substring -> falsche Sortierung
 
Nur so aus Neugier, ist das Sortfeld jetzt nötig oder kann man das Iif auch nur im Order By verwenden? In Oracle hätte ich nämlich sowas versucht (Decode ist sowas wie IIf):

SQL-Code:
Order By Substr(Feld,2,4), -- die Jahre
         Decode(Substr(Feld,1,1),'I',0,1)
Alternativ ginge vielleicht auch ein Replace, wo I durch 0 ersetzt wird, in deinem ursprünglichen SQL1:
SQL-Code:
--
Order By substring(1 from 2 for 4)||Replace(substring(1 from 1 for 1),'I','0')
Wenn es in FB ein Replace gibt.

TigerLilly 25. Jan 2020 13:56

AW: "Case" "Order By Nulls First" und Substring -> falsche Sortierung
 
Ich würde ein select ... order by case() verwenden.
https://firebirdsql.org/refdocs/langrefupd15-case.html

Code:
...
order by
when feld
case '1' then '00000'
else
 <die hier vorgeschlagenen Lösungen, damit du JJJJQ erhältst>

hoika 25. Jan 2020 15:30

AW: "Case" "Order By Nulls First" und Substring -> falsche Sortierung
 
Hallo,
ich habe das IIF genommen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz