AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Eigene Sortierung

Ein Thema von BlueStarHH · begonnen am 19. Aug 2022 · letzter Beitrag vom 21. Aug 2022
Antwort Antwort
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hamburg
849 Beiträge
 
Delphi 11 Alexandria
 
#1

Eigene Sortierung

  Alt 19. Aug 2022, 12:19
Datenbank: Firebird • Version: 3.x • Zugriff über: IBDAC
Hallo,

ich habe eine Tabelle mit einem Varchar-Feld. In diesem Feld sind sowohl Texte als auch Zahlen abgespeichert. Zum Beispiel die Ausgabe mit:
Code:
select MyField from MyTable order by MyField
Code:
1
11
2
A
B
C
Zu sehen ist, dass die 11 vor der 2 sortiert wird, weil die Zahlen als Text gespeichert sind. Ich möchte nun, dass die Zahlen so sortiert werden, wie man es von Zahlen erwartet und die Texte so wie immer:
Code:
1
2
11
A
B
C
Mein Versuch:
Code:
select MyField from MyTable
order by iif(MyField SIMILAR TO '[0-9]+', cast(MyField as Integer), 000)
Das funktioniert so, aber nur für die Zahlen. Was muss ich an Stelle der 000 eintragen, damit auch Texte sortiert werden? Da müsste man irgendwie aus den Texten eine Zahl für den Sortiervergleich erstellen.
  Mit Zitat antworten Zitat
lxo

Registriert seit: 30. Nov 2017
288 Beiträge
 
Delphi 12 Athens
 
#2

AW: Eigene Sortierung

  Alt 19. Aug 2022, 12:28
Code:
create collation unicode_num for utf8 from unicode 'NUMERIC-SORT=1';
Die Collation kannst du anlegen und dann entweder eine Domain erstellen und diese verwenden.

Code:
CREATE DOMAIN MYDOMAIN AS VARCHAR(15) CHARACTER SET UTF8 COLLATE UNICODE_NUM;
Oder einfach beim order by das Collate angeben

Code:
select T.TEXTNUMMER
from TEST T
order by T.TEXTNUMMER collate UNICODE_NUM
  Mit Zitat antworten Zitat
lxo

Registriert seit: 30. Nov 2017
288 Beiträge
 
Delphi 12 Athens
 
#3

AW: Eigene Sortierung

  Alt 19. Aug 2022, 12:31
Code:
create collation unicode_num for utf8 from unicode 'NUMERIC-SORT=1';
Die Collation kannst du anlegen und dann entweder eine Domain erstellen und diese verwenden.

Die verfügbaren Collations findest du dann unter:

Code:
select * from RDB$COLLATIONS
Weiter Infos dazu siehe:
https://firebirdsql.org/file/documen...tion-create-de
https://www.ibexpert.net/ibe_de/pmwi...NUMERICDECIMAL





** Falls du noch Firebird 3.0.2 oder älter verwendest kann das noch falsche Ergebnisse liefern, siehe folgendes Ticket. (Mit 3.0.3 sollte es keine Probleme mehr damit geben)
https://github.com/FirebirdSQL/firebird/issues/5904

Geändert von lxo (19. Aug 2022 um 12:42 Uhr) Grund: Info zum Fehler bis FB-3.0.2
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.351 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Eigene Sortierung

  Alt 19. Aug 2022, 13:56
Das funktioniert so, aber nur für die Zahlen. Was muss ich an Stelle der 000 eintragen, damit auch Texte sortiert werden? Da müsste man irgendwie aus den Texten eine Zahl für den Sortiervergleich erstellen.
Dann halt als String:

SQL-Code:
select MyField from MyTable
order by iif(MyField SIMILAR TO '[0-9]+', lpad(MyField, 10, '0'), MyField)
Frank
Frank Reim
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hamburg
849 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Eigene Sortierung

  Alt 19. Aug 2022, 14:01
Code:
create collation unicode_num for utf8 from unicode 'NUMERIC-SORT=1';
Danke, das klappt super.

Nur wie ändere ich die collation für ein vorhandenes Feld? Das beides klappt nicht, da er "collate" nicht kennt:

Code:
ALTER DOMAIN RDB$34 TYPE VARCHAR(15) CHARACTER SET UTF8 collate UNICODE_CI_AI_NUM;

alter table MyTable
alter column MyField
type varchar(15)
character set UTF8
collate UNICODE_CI_AI_NUM;
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hamburg
849 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Eigene Sortierung

  Alt 19. Aug 2022, 14:03
SQL-Code:
select MyField from MyTable
order by iif(MyField SIMILAR TO '[0-9]+', lpad(MyField, 10, '0'), MyField)
Das ist auch eine gute Idee, wenn man die Collation-Lösung nicht nutzen kann oder möchte.
In meinem Fall würde ich die Collation-Lösung eleganter finden, da diese dann bei allen Sortierungen automatisch benutzt wird, wenn sie in der Felddefintion angegeben ist.
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.351 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Eigene Sortierung

  Alt 19. Aug 2022, 14:45
Nur wie ändere ich die collation für ein vorhandenes Feld? Das beides klappt nicht, da er "collate" nicht kennt:

Code:
ALTER DOMAIN RDB$34 TYPE VARCHAR(15) CHARACTER SET UTF8 collate UNICODE_CI_AI_NUM;

alter table MyTable
alter column MyField
type varchar(15)
character set UTF8
collate UNICODE_CI_AI_NUM;
Man sollte besser mit domains arbeiten.
Machst du Felddefinitionen ohne domain, dann legt dir Firebird selbst eine domain "RDB$XXX" an.
Diese automatisch erzeugten domain kann man ändern:
update RDB$RELATION_FIELDS set RDB$COLLATION_ID = 2 where RDB$FIELD_NAME = 'feldname' and RDB$RELATION_NAME = 'tabellenname'

Arbeitest du mit domain, dann weist du dem Feld eine neue domain zu.
ALTER TABLE tabellenname ALTER COLUMN feldname TYPE neuer_domainnamw

SQL-Code:
CREATE DOMAIN D_VARCHAR_40_NUMSORT AS VARCHAR(40) CHARACTER SET UTF8 COLLATE UNICODE_NUM;
ALTER TABLE MYTABLE ALTER COLUMN MYFIELD TYPE D_VARCHAR_40_NUMSORT;
Frank
Frank Reim

Geändert von dataspider (19. Aug 2022 um 14:53 Uhr)
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hamburg
849 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Eigene Sortierung

  Alt 19. Aug 2022, 15:46
Man sollte besser mit domains arbeiten.
Machst du Felddefinitionen ohne domain, dann legt dir Firebird selbst eine domain "RDB$XXX" an.
Diese automatisch erzeugten domain kann man ändern:
update RDB$RELATION_FIELDS set RDB$COLLATION_ID = 2 where RDB$FIELD_NAME = 'feldname' and RDB$RELATION_NAME = 'tabellenname'
update RDB$RELATION_FIELDS geht in Firebird 3 nicht mehr. Man soll SQL verwenden. Siehe oben in meinem Post #5 "ALTER DOMAIN" und "ALTER Table". Doch da ist eben das Problem, dass dort keine Collate angegeben werden kann.
  Mit Zitat antworten Zitat
lxo

Registriert seit: 30. Nov 2017
288 Beiträge
 
Delphi 12 Athens
 
#9

AW: Eigene Sortierung

  Alt 21. Aug 2022, 14:18
Ich sehe da keine Möglichkeit außer eine neue DOMAIN zu erstellen und die Felder dann auf diese umzustellen.

https://github.com/FirebirdSQL/firebird/issues/1627
  Mit Zitat antworten Zitat
Antwort Antwort


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 19:03 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