2009-08-05 17 views
0

I eine Tabelle mit einer Spalte „otname“ haben table1.otname enthält mehrere Zeilen von alphanumerischen Zeichenfolge ähnelt die folgende Datenabtastwert:einen Teil einer alphanumerischen Zeichenfolge in SQL Lese

11.10.32. .U.A.F.3.2.21.249.1

2001.1.1003. .A.LE.P.P

2010.1.1003. .A.LE.B.B

ich die vierte Zahl in jeder Zeichenfolge (Teil der Zeichenfolge in fett) und schreiben Sie eine Abfrage in Oracle 10g lesen will seine Beschreibung in einer anderen Tabelle gespeichert zu lesen. Mein Dilemma ist das Schreiben des ersten Teils von query.i.e.

Meine zweite Abfrage wird so etwas wie dies in einer Tabelle die vierte Anzahl von jeder Zeichenfolge Auswahl:

select description_text from table2 where sncode = 8281 -- fourth part of the data sample in every string 

Vielen Dank.

Anfänger

Antwort

0

Arbeiten mit 9i +:

WITH portion AS (
    SELECT SUBSTR(t.otname, INSTR(t.otname, ".", 1, 3)+1, INSTR(t.otname, ".", 1, 4)) 'sncode' 
    FROM TABLE t) 
SELECT t.description_text 
    FROM TABLE2 t 
    JOIN portion p ON p.sncode = t.sncode 

Die Verwendung von SUBSTR sollte offensichtlich sein; wird verwendet, um den Punkt (.) Zu finden, beginnend mit dem ersten Zeichen in der Zeichenfolge (Parameterwert 1), am 3. und 4. Auftreten in der Zeichenfolge. Sie könnten eine subtrahieren haben von der Position für die vierte Instanz der Zeit zurück - testen Sie diese zuerst sicher sein, die richtigen Werte sind immer:

SELECT SUBSTR(t.otname, INSTR(t.otname, ".", 1, 3)+1, INSTR(t.otname, ".", 1, 4)) 'sncode' 
FROM TABLE t 

I subquery Factoring verwendet, um der Teil geschieht, bevor Sie beitreten zu der zweiten Tabelle. Es kann als Unterabfrage durchgeführt werden, aber die Unterabfrage ist schneller.

+0

ich folgende Fehlermeldung erhalten, wenn ich die oben laufen Abfrage: ORA: 00923: FROM Schlüsselwort nicht gefunden, wo erwartet :( – novice

+0

Ich habe keine Oracle-Instanz zu testen, aber der einzige Punkt der Auseinandersetzung, die ich sehen kann, wäre die "+1" in der ersten INSTR. Sie sind sicher, dass Sie eine haben Leerzeichen zwischen dem FROM und dem Tabellennamen in dem, was Sie versucht haben, auszuführen? –

0

Neuere Versionen von Oracle (einschließlich 10g) haben verschiedene Funktionen für reguläre Ausdrücke. So können Sie etwas tun:

where sncode = to_number(regexp_replace(otname, '^(\d+\.\d+\.\d+\.(\d+))?.+$', '\2')) 

Dies entspricht 3 Sätze von Ziffern-Follow-by-a-Punkt und einem vierten gruppiert Satz von Ziffern, die von dem Rest der Zeichenfolge gefolgt, und gibt einen String bestehend aus allem, was vollständig durch die erste Gruppe ersetzt wurde (die vierte Ziffernfolge).

ist die komplette Abfrage (wenn ich Ihre Beschreibung der beiden Tabellen richtig verstanden):

select t2.description_text 
from table1 t1, table2 t2 
where t2.sncode = to_number(regexp_replace(t1.otname, '^(\d+\.\d+\.\d+\.(\d+))?.+$', '\2')) 

Eine andere etwas kürzere Alternative regex:

where t2.sncode = to_number(regexp_replace(t1.otname, '^((\d+\.){3}(\d+))?.+$', '\3')) 
+0

Ich lief Ihre Abfrage und ich bekomme den folgenden Fehler: ORA-01722: ungültige Nummer Irgendwelche Vorschläge? – novice

+0

Ich vermute ich nahm an, dass dein "sncode" auch eine Zeichenkette war. Lass es mich wissen, wenn es eine Nummer ist. In der Zwischenzeit aktualisiere ich meine Antwort, um das zu reflektieren, also kannst du es versuchen (die Funktion "to_number"). – epost

+0

danke. Der sncode ist eigentlich eine Nummer. otname ist alphanumerisch – novice

Verwandte Themen