2017-09-03 1 views
0

Ich habe folgende SQL-Ergebniseinträge.Extrahieren verschachtelte Zeichenfolge aus Textspalte

Result 
--------- 
TW - 5657980 Due Date updated : to <strong>2017-08-13 10:21:00</strong> by <strong>System</strong> 
TW - 5657980 Priority updated from <strong> Medium</strong> to <strong>Low</strong> by <strong>System</strong> 
TW - 5657980 Material added: <strong>1000 : Cash in Bank - Operating (Old)/ QTY:2</strong> by <strong>System</strong>#9243 
TW - 5657980 Labor added <strong>Kelsey Franks/14:00 hours </strong> by <strong>System</strong>#65197 

Jetzt versuche ich, eine kurze Beschreibung aus diesem Ergebnis zu extrahieren und zu versuchen, es auf die anderen Spalt in der gleichen Tabelle zu migrieren.

Expected result 
-------------- 
Due Date Updated 
Priority Updated 
Material Added 
Labor Added 

Ignorieren Sie die ersten 13 Zeichen. In den meisten Fällen endet es mit "aktualisiert". Wenige enden mit "hinzugefügt". Es sollte nicht zwischen Groß- und Kleinschreibung unterschieden werden.
Gibt es eine Möglichkeit, das erwartete Ergebnis zu erhalten.

+0

Es gibt nicht genug Informationen, um Ihre Aufgabe zu definieren. –

+0

@Erwin: Ich möchte Zeichenfolge in SQL extrahieren und möchte Ergebnis wie erwähnt erhalten. –

+0

Die wichtige Information fehlt: endet die "Kurzbeschreibung" immer mit "aktualisiert" oder "hinzugefügt"? Groß- und Kleinschreibung (Und keines dieser Wörter erscheint mehr als einmal?) Ist der führende Teil, den wir ignorieren, immer genau 13 Zeichen lang? Oder wie sonst sind Anfang und Ende der Zeichenfolge genau definiert? –

Antwort

1

Lösung mit substring() mit einem regulären Ausdruck. Es überspringt die ersten 13 Zeichen, dann nimmt die Zeichenfolge bis zum ersten 'aktualisiert' oder 'hinzugefügt', Groß-und Kleinschreibung, mit führenden Leerzeichen. Else NULL:

SELECT substring(result, '(?i)^.{13}(.*? (?:updated|added))') 
FROM tbl; 

Die regexp erklärt:

(?i) .. meta-syntax auf Groß- und Kleinschreibung passende
^ .. Beginn der Zeichenfolge
.{13} .. überspringen die ersten 13 Zeichen zu wechseln
() .. Fangklammer (erfasst Nutzlast)
.*? .. beliebig viele Zeichen (non-greedy)
(?:) .. Nicht-Erfassung Klammer
(?:updated|added) .. 2 Zweige (string endet in 'aktualisiert' oder 'hinzugefügt')


Wenn wir nicht like you later commented auf 13 führende Zeichen verlassen können, benötigen wir einige andere zuverlässige Definition stattdessen. Ihre Schwierigkeit scheint mit verschwommenen Anforderungen mehr zu sein als bei der eigentlichen Implementierung.

Sag mal, wir beschäftigen uns mit 1 oder mehr Nicht-Ziffern, gefolgt von 1 oder mehr Ziffern, ein Leerzeichen und dann die Nutzlast, wie oben definiert:

SELECT substring(result, '(?i)^\D+\d+ (.*? (?:updated|added))') ... 

\d .. Klasse Abkürzung für Ziffern
\D .. Nicht-Ziffern, das Gegenteil von \d

+0

Danke für die Info. Ist es möglich, 13 Zeichen Länge zu finden? Ich fand, dass wenn seine 12 oder 11 Zeichen dann das falsche Ergebnis ergeben. –

+0

wird es gut sein, wenn wir dynamische Zeichen Länge bekommen. Manchmal seine 10, 11,12 oder 13. –

+0

@PranavUnd: Alles möglich, Sie müssen nur vollständige Informationen * in der Frage * geben. Was definiert den Anfang der Zeichenfolge, wenn nicht Position 14? Die erste Nicht-Ziffer nach der ersten Ziffernfolge und ein Leerzeichen? Ich habe eine andere Lösung basierend auf meiner Vermutung hinzugefügt. –

Verwandte Themen