AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken "Case" "Order By Nulls First" und Substring -> falsche Sortierung

"Case" "Order By Nulls First" und Substring -> falsche Sortierung

Ein Thema von hoika · begonnen am 24. Jan 2020 · letzter Beitrag vom 25. Jan 2020
Antwort Antwort
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
7.572 Beiträge
 
Delphi XE4 Professional
 
#1

"Case" "Order By Nulls First" und Substring -> falsche Sortierung

  Alt 24. Jan 2020, 11:43
Datenbank: FB • Version: 2 • Zugriff über: IBDAC
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.
Heiko
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
2.759 Beiträge
 
Delphi 2010 Enterprise
 
#2

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

  Alt 24. Jan 2020, 11:48
Wieso konkatenierst Du den gesamten ORDER BY Ausdruck?
Mach doch order by für einzelne Substrings und nutze asc, desc.
Gruß, Jo

Geändert von jobo (24. Jan 2020 um 11:55 Uhr) Grund: Präzisierung
  Mit Zitat antworten Zitat
alex517

Registriert seit: 23. Nov 2004
Ort: Bernau b. Berlin
255 Beiträge
 
Delphi XE5 Enterprise
 
#3

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

  Alt 24. Jan 2020, 12:29
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
Alexander
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
7.572 Beiträge
 
Delphi XE4 Professional
 
#4

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

  Alt 24. Jan 2020, 13:01
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).
Heiko
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.585 Beiträge
 
Delphi 6 Enterprise
 
#5

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

  Alt 25. Jan 2020, 11:56
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.
Ralph
  Mit Zitat antworten Zitat
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
664 Beiträge
 
Delphi 10.3 Rio
 
#6

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

  Alt 25. Jan 2020, 14:56
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>

Geändert von TigerLilly (25. Jan 2020 um 14:59 Uhr)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
7.572 Beiträge
 
Delphi XE4 Professional
 
#7

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

  Alt 25. Jan 2020, 16:30
Hallo,
ich habe das IIF genommen.
Heiko
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:32 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf