Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   VarChar-Feld numerisch sortieren (https://www.delphipraxis.net/195523-varchar-feld-numerisch-sortieren.html)

BlueStarHH 7. Mär 2018 09:25

Datenbank: Firebird • Version: 2.5 • Zugriff über: IBDAC

VarChar-Feld numerisch sortieren
 
Per Default-Verhalten werden Zahlen in VarChar-Feldern wie folgt sortiert:

Code:
1
10
100
2
20
Ich möchte nun aber eine Sortierung in numerischer Reihenefolge:

Code:
1
2
10
20
100
In der Firebird-Hilfe steht, dass man sich eine "collation" mit dieser Sortierung wie folgt anlegen kann:

SQL-Code:
create collation UNICODE_NUM for utf8
from UNICODE_CI_AI 'NUMERIC-SORT=1';
Das wird ohne Problem ausgeführt.

Wenn ich diese collation nun aber einem neuen Feld nutzen möchte, erscheint der folgende Fehler:

SQL-Code:
ALTER TABLE MyTable
ADD MyCol VARCHAR(10) CHARACTER SET UNICODE_NUM
Fehler:
Code:
Undefined name.
Dynamic SQL Error.
SQL error code = -204.
Data type unknown.
CHARACTER SET UNICODE_NUM is not defined.
Was mache ich falsch? Vielen Dank im Voraus!

PS: In meinem Feld stehen sowohl Texte als auch Zahlen und beides auch gemischt (z.B. 100HX12). Deswegen kann ich kein Integer-Feld nehmen.

Blup 7. Mär 2018 10:08

AW: VarChar-Feld numerisch sortieren
 
Du hast eine "collation" erzeugt, für den "CHARACTER SET" utf8.

ALTER TABLE MyTable
ADD MyCol VARCHAR(10) CHARACTER SET utf8 COLLATE UNICODE_NUM

Beim Sortieren kann die "collation" auch angegeben werden.

select * from TABELLE order by FELDNAME collate UNICODE_NUM

BlueStarHH 7. Mär 2018 10:40

AW: VarChar-Feld numerisch sortieren
 
Danke!

Nun hab ich aber noch ein Problem. Ich benötige das auch für ein ASCII-Feld:

Das Feld ist so definiert:

SQL-Code:
CREATE TABLE MyTable (
    MyCol VARCHAR(10) CHARACTER SET ASCII,
   ...
)
Ich möchte das dann so nutzen:

SQL-Code:
select * from MyTable order by ASCII_NUM


ASCII_NUM versuche ich so anzulegen:

SQL-Code:
create collation ASCII_NUM for ASCII
from ASCII 'NUMERIC-SORT=1';
Ergibt den Fehler:

Code:
This operation is not defined for system tables. unsuccessful metadata update. Invalid collation attributes.
Im IBExpert wird angezeigt, dass die collation auch ASCII heißt, die zum Character-Set ASCII gehört. Stimmt das nicht?!

hstreicher 7. Mär 2018 11:25

AW: VarChar-Feld numerisch sortieren
 
wenn es ohne collations sein darf dann ist CAST dein Freund

select * from myable order by cast(mycol as integer)

BlueStarHH 7. Mär 2018 11:44

AW: VarChar-Feld numerisch sortieren
 
Zitat:

Zitat von hstreicher (Beitrag 1395439)
wenn es ohne collations sein darf dann ist CAST dein Freund

select * from myable order by cast(mycol as integer)

Das funktioniert nicht, denn:

Zitat:

PS: In meinem Feld stehen sowohl Texte als auch Zahlen und beides auch gemischt (z.B. 100HX12). Deswegen kann ich kein Integer-Feld nehmen.

Bernhard Geyer 7. Mär 2018 11:53

AW: VarChar-Feld numerisch sortieren
 
Muss es au DB-Seite sortiert werden?
Wir holen uns die unsortierte Ergebnisliste und sortieren dann auf Client-Seite mit einem eigens entwickelten "Natürliche Sortierung"-Algorithmus.

TigerLilly 8. Mär 2018 06:53

AW: VarChar-Feld numerisch sortieren
 
Du kannst auch nach links mit 0 auffüllen + dann sortieren:

'00001'
'00002'
'00010'

etc

BlueStarHH 8. Mär 2018 07:17

AW: VarChar-Feld numerisch sortieren
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1395448)
Muss es au DB-Seite sortiert werden?

Ja, da nicht alle Daten zum Client übertragen werden.

BlueStarHH 8. Mär 2018 07:19

AW: VarChar-Feld numerisch sortieren
 
Zitat:

Zitat von TigerLilly (Beitrag 1395532)
Du kannst auch nach links mit 0 auffüllen + dann sortieren:

'00001'
'00002'
'00010'

etc

Das geht in meinem Fall leider nicht, denn:

Zitat:

PS: In meinem Feld stehen sowohl Texte als auch Zahlen und beides auch gemischt (z.B. 100HX12). Deswegen kann ich kein Integer-Feld nehmen.
Spätestens bei den gemischten Inhalten gibt es dann Probleme und der Anwender wundert sich, was die Nullen sein sollen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:10 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