Converting une telle table, vous devez ajouter une colonne entière indexé spécial pour garder les données entières extraites. Notez que cette requête en utilisant "conversion très pratique" est en fait plutôt mauvaise: vous devez utiliser des colonnes indexées pour trier de grandes quantités de données, sinon vous allez ralentir l'exécution et perdre beaucoup de mémoire/disque pour les tables de tri temporaires.
Vous devez donc ajouter une colonne indexée supplémentaire et l'utiliser dans la requête.
La question suivante est de savoir comment remplir cette colonne. Il vaudrait mieux le faire une fois, quand vous déplacez toute votre base de données et application de BDE vers Firebird. Et à partir de ce point, faites votre demande lors de la saisie de nouvelles lignes de données remplir correctement les colonnes varchar
et integer
.
Une conversion de temps peut être effectuée par votre application de conversion, puis. Ou vous pouvez utiliser Stored Procedure
sélectionnable qui répéterait le tableau avec une telle colonne et ajouté. Ou vous pouvez créer Execute Block
qui parcourrait la table et mettrait à jour ses lignes en calculant la valeur de cet entier.
How to SELECT a PROCEDURE in Firebird 2.5
Si vous devez conserver les applications existantes, que seule insérer colonne de texte, mais pas la colonne entier, alors je pense que vous devez utiliser BEFORE UPDATE OR INSERT
déclencheurs dans Firebird, ce serait analyser la lettre de valeur de la colonne de texte par lettre et en extrait un entier. Et assurez-vous que votre application ne modifie jamais directement cette colonne entière.
Voir un exemple de déclenchement à Trigger on Update Firebird
documentation linguistique PSQL: https://www.firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref25-psql.html
Que vous écririez procédure ou de trigger pour remplir ledit nombre entier ajouté colonne indexée, vous devez faire simple boucle sur les caractères, la copie chaîne du premier chiffre jusqu'au premier non-chiffre.
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
Quelque chose comme ça
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;
Dans cet exemple, votre ORDER order2, order1
deviendrait
SELECT ..... FROM my_table ORDER BY MY_INT_COLUMN, MY_TXT_COLUMN
De plus, il semble que votre colonne contienne réellement une donnée composée: un index entier et un suffixe textuel optionnel. Si c'est le cas, les données que vous avez ne sont pas normalisées et la table doit être restructurée.
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)
);
Lorsque vous déplacez vos données de Paradox à Firebird - libeller votre chèque d'application de convertisseur et de diviser ces valeurs comme « 1 bis » en deux nouvelles colonnes.
Et votre requête serait alors comme
SELECT ORDER_TXT, ... FROM my_table ORDER BY ORDER_Int, ORDER_PostFix
Il n'y a rien dans Firebird 2.5 lui-même qui ferait cela. Vous devrez trouver (ou écrire) un UDF qui fait cela, ou faire une manipulation de hacky string dans une procédure stockée. –
Notez que cette question concerne Firebird 2.5. Dans la version 3.0, on pourrait utiliser [SubString with Regular expressions] (https://firebirdsql.org/file/documentation/release_notes/html/fr/3_0/bk01ch09s05.html#rnfb30-dml-substring). – NineBerry
Merci @NineBerry pour l'édition du titre, bien sûr BDE n'avait rien à faire dans l'objectif de ma demande ... et bien sûr oui, je suis au courant des améliorations de Firebird 3 ... Je pense qu'un nouveau champ avec la valeur entière serait la meilleure solution pour éviter le calcul chaque fois que c'est nécessaire ... – Darkendorf