2017-11-11 13 views
0

Ich habe Wert von Varchar wie dieses 'M000000000009', und ich erwarte Ergebnis dieses Wertes um 1 erhöht, 'M000000000010'. Wie kann ich das tun?Wie man in Orakel einen String hinzufügt

select 'M000000000009'+ 1 from dual 
+2

Die einfachste Möglichkeit besteht darin, das Tabellenschema zu reparieren, sodass Sie eine * Präfix * Spalte und eine * Nummer * Spalte haben. Außerdem müssen Sie die Abfrage korrigieren, die Ihren Frankenwert ausgibt, um diese beiden Werte in der richtigen Weise * zu formatieren *. – Bohemian

Antwort

3

Sie diese Option auswählen können versuchen:

SELECT SUBSTR('M000000000009', 1, 1) || LPAD((TO_NUMBER(SUBSTR('M000000000009',2)) + 1), 12, '0') NEW_SERIAL 
FROM DUAL 
0

Brute-Force-und recht nicht

select 
     substr(str,1,1) || substr(concat('0000000000000' , cast(substr(str,2,13) as int) + 1),-12) x 
    from (
    select 
     'M000000000009' as str 
    from dual 
    ) 

nb: fehl, wenn der vorletzte Teil dieser Zeichenfolge gegossen nicht auf eine ganze Zahl

1

Jedes Mal stellen wir uns eine Frage wie "Wie füge ich 1 zu einer Zeichenfolge hinzu?" wir wissen, dass wir einen Konstruktionsfehler gemacht haben. Es ist, als würde man fragen: "Welche dieser Krawatten passt besser zu diesem Polohals?" Es ist einfach falsch.

'M000000000009' ist, was als ein "intelligenter Schlüssel" bekannt ist. Das heißt, eine Spalte, die tatsächlich zwei oder mehr Teile umfasst. Dies ist die erste Normalform, weil sie nicht atomar ist (obwohl Atomizität tricky to define ist).

Aber das ist nicht irgendein abstrakter Entwurfspunkt: intelligente Schlüssel sind dumm. Es ist schwer mit ihnen zu arbeiten, wie du herausgefunden hast. Zwangsläufig werden wir SUBSTR und INSTR beim Schreiben von Abfragen oder beim Füllen von Datensätzen verwenden.

Die bessere Implementierung besteht darin, die atomaren Komponenten des Smartkeys als separate Spalten zu speichern und sie miteinander zu verketten, wenn sie dem Benutzer präsentiert werden. Dies war immer noch ein bisschen Schmerz, aber Oracle entfernte die Pfaffing etwa in 11g mit der Einführung der sehr ordentlich virtuellen Spalte. Dies sind regelbasierte Spalten, die automatisch aus anderen Spalten gefüllt werden. Wir können Indizes und sogar Einschränkungen für virtuelle Spalten erstellen.

In Ihrem Beispiel haben Sie also einen Schlüssel, der aus einem alphabetischen Präfix und einer monoton steigenden Zahl besteht. Sie können es wie folgt implementieren:

create table t23 
    (cat_code varchar2(1) not null 
    , cat_number number(11,0) not null 
    , catalogue_no varchar2(12) 
     as (cast(cat_code||lpad(to_char(cat_number), 11, '0') as varchar2(12))) virtual 
    , constraint t23_pk primary key (catalogue_no) 
) 

LiveSQL demo script.

Die numerische Komponente cat_number eine Zahl ist, so dass Sie es wie jede andere Zahl bevölkern können - von Arithmetik, mit einer Sequenz oder - seit 12c - als IDENTITY spalte:

create table t23 
    (cat_code varchar2(1) not null 
    , cat_number number generated always as identity 
    , catalogue_no varchar2(12) as (cast(cat_code||lpad(to_char(cat_number), 11, '0') as varchar2(12))) virtual 
    , constraint t23_pk primary key (catalogue_no) 
) 
/
Verwandte Themen