![]() |
Datenbank: Firebird • Version: 3.x • Zugriff über: IBDAC
Eigene Sortierung
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:
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:
1
11 2 A B C
Code:
Mein Versuch:
1
2 11 A B C
Code:
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.
select MyField from MyTable
order by iif(MyField SIMILAR TO '[0-9]+', cast(MyField as Integer), 000) |
AW: Eigene Sortierung
Code:
Die Collation kannst du anlegen und dann entweder eine Domain erstellen und diese verwenden.
create collation unicode_num for utf8 from unicode 'NUMERIC-SORT=1';
Code:
Oder einfach beim order by das Collate angeben
CREATE DOMAIN MYDOMAIN AS VARCHAR(15) CHARACTER SET UTF8 COLLATE UNICODE_NUM;
Code:
select T.TEXTNUMMER
from TEST T order by T.TEXTNUMMER collate UNICODE_NUM |
AW: Eigene Sortierung
Zitat:
Die verfügbaren Collations findest du dann unter:
Code:
Weiter Infos dazu siehe:
select * from RDB$COLLATIONS
![]() ![]() ** 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) ![]() |
AW: Eigene Sortierung
Zitat:
SQL-Code:
Frank
select MyField from MyTable
order by iif(MyField SIMILAR TO '[0-9]+', lpad(MyField, 10, '0'), MyField) |
AW: Eigene Sortierung
Zitat:
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; |
AW: Eigene Sortierung
Zitat:
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. |
AW: Eigene Sortierung
Zitat:
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:
Frank
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; |
AW: Eigene Sortierung
Zitat:
|
AW: Eigene Sortierung
Ich sehe da keine Möglichkeit außer eine neue DOMAIN zu erstellen und die Felder dann auf diese umzustellen.
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz