Konvertieren einer solchen Tabelle, haben Sie für das halten der extrahierten integer-Daten eine spezielle indizierte integer-Spalte hinzuzufügen.
Hinweis, diese Abfrage bei der Verwendung "sehr bequeme Konvertierung" ist eigentlich ziemlich schlecht: Sie sollten indizierte Spalten verwenden, um große Datenmengen zu sortieren (bestellen), sonst gehen Sie in die langsame Ausführung und verschwenden viel Speicher/Festplatte für temporäre Sortiertische.
Sie müssen also eine zusätzliche ganzzahlige Indexspalte hinzufügen und in der Abfrage verwenden.
Nächste Frage ist, wie man diese Spalte auffüllt.
Besser wäre es einmal zu tun, wenn Sie Ihre gesamte Datenbank und Anwendung von BDE auf Firebird verschieben. Und ab diesem Punkt füllen Sie Ihre Anwendung bei der Eingabe neuer Datenzeilen BEIDE varchar
und integer
Spalten richtig.
Einmalige Konvertierung kann dann von Ihrem Konverter-Anwendung durchgeführt werden. Oder Sie können wählbar Stored Procedure
verwenden, die die Tabelle mit dieser und addierten Spalte wiederholen würde. Oder Sie können Execute Block
machen, die durch die Tabelle iterieren und ihre Zeilen aktualisieren würde, um den besagten ganzzahligen Wert zu berechnen.
How to SELECT a PROCEDURE in Firebird 2.5
Wenn Sie Legacy-Anwendungen halten müssten, dass nur Textspalte einfügen, aber nicht Spalte integer, dann denke ich, Sie würden BEFORE UPDATE OR INSERT
löst in Firebird verwenden, das würde die Textspalte Wert Brief parsen durch Buchstabe und extrahiere Ganzzahl daraus. Und dann stellen Sie sicher, dass Ihre Anwendung diese Integer-Spalte niemals direkt ändert.
Sehen Sie ein Trigger Beispiel bei Trigger on Update Firebird
PSQL Sprache Dokumentation: https://www.firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref25-psql.html
Ob Prozedur oder Trigger schreiben würde die angebaute ganze Zahl indizierten Spalt zu füllen, würden Sie einfach Schleife über Zeichen machen müssen, Kopieren String von der ersten Ziffer bis zur ersten Ziffer.
https://www.firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref25-functions-scalarfuncs.html#fblangref25-functions-string
https://www.firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref25-psql-coding.html#fblangref25-psql-declare-variable
etwas wie das
CREATE TRIGGER my_trigger FOR my_table
BEFORE UPDATE OR INSERT
AS
DECLARE I integer;
DECLARE S VARCHAR(100);
DECLARE C VARCHAR(100);
DECLARE R VARCHAR(100);
BEGIN
S = TRIM(NEW.MY_TXT_COLUMN);
R = NULL;
I = 1;
WHILE (i <= CHAR_LENGTH(S)) DO
BEGIN
C = SUBSTRING(s FROM i FOR 1);
IF (C < '0') THEN LEAVE;
IF (C > '9') THEN LEAVE;
IF (C IS NULL) THEN LEAVE;
IF (R IS NULL) THEN R=C; ELSE R = R || C;
I = I + 1;
END
NEW.MY_INT_COLUMN = CAST(R AS INTEGER);
END;
In diesem Beispiel Ihre ORDER order2, order1
SELECT ..... FROM my_table ORDER BY MY_INT_COLUMN, MY_TXT_COLUMN
werden würde
Darüber hinaus scheint Ihre Spalte tatsächlich zusammengesetzte Daten zu enthalten: ein ganzzahliger Index und ein optionaler Textpostfix. Wenn dies der Fall ist, werden die Daten, die Sie haben, nicht normalisiert und die Tabelle wird besser umstrukturiert.
CREATE TABLE my_table (
ORDER_Int INTEGER NOT NULL,
ORDER_PostFix VARCHAR(24) CHECK(ORDER_PostFix = TRIM(ORDER_PostFix)),
......
ORDER_TXT COMPUTED BY (ORDER_INT || COALESCE(' ' || ORDER_PostFix, '')),
PRIMARY KEY (ORDER_Int, ORDER_PostFix)
);
Wenn Sie Ihre Daten von Paradox zu Firebird bewegen würde - Ihre Konverter Anwendung Prüfung machen und teilen diese Werte wie „1 bis“ in zwei neue Spalten.
Und Ihre Frage wäre dann wie
SELECT ORDER_TXT, ... FROM my_table ORDER BY ORDER_Int, ORDER_PostFix
Es gibt nichts in Firebird 2.5 selbst, das dies tun würde. Sie müssen eine UDF finden (oder schreiben), die dies tut, oder eine Hacky-String-Manipulation in einer gespeicherten Prozedur durchführen. –
Beachten Sie, dass diese Frage für Firebird 2.5 ist. In 3.0 könnte man [SubString mit regulären Ausdrücken] (https://firebirdsql.org/file/documentation/release_notes/html/en/3_0/bk01ch09s05.html#rnfb30-dml-substring) verwenden. – NineBerry
Danke @NineBerry für die Bearbeitung des Titels, natürlich hatte BDE nichts zum Ziel meiner Anfrage zu tun ... und natürlich ja, mir sind Firebird 3 Verbesserungen bekannt ... Ich denke ein neues Feld mit dem Integer-Wert wäre die beste Lösung, um Berechnungen jedes Mal zu vermeiden, wenn es benötigt wird ... – Darkendorf