2016-07-02 10 views
0

Lassen Sie uns sagen, dass ich ein Freitextfeld ‚Notiz‘ und enthält genannt haben „ABC: 5/52, * zurück, Auftragseingang“Extract mehrere Strings aus einem Freitextfeld

Wie extrahieren I ‚5/52 'und' zurück 'und platziere sie in zwei separaten Spalten?

Hier ist, was ich

QUERY:- 

SELECT *, SUBSTRING(Note, CHARINDEX(':', Note)+1, 4) as ABC, 
SUBSTRING(Note, CHARINDEX('*', Note)+1, 4) as Ret_Stat 
, CHARINDEX(':', Note) AS [Colon Index] 

FROM [AdventureWorks2012].[Sales].[Comments] 

RESULT:- 
Note           ABC  Ret_Stat 
ABC:3/52, To give more explanation, *back  3/52  back 
ABC:3wks, To debrief, *back, r/v    3wks  back 
ABC:13/09/16, see cm, *back, new referral  13/0  back 

Mein Problem ist, ich wollte 3/52, 3wks extrahieren und 13/09/16, aber mein Ergebnis einzige 13/10 erreichen wollte. Ich möchte fragen, wie man das erreicht? da die Bedingung der Extraktion von 4 bis 8 Zeichen nach ABC variieren kann: und die Tabelle enthält Tausende von Datenzeilen

Brauchen Sie Rat. Danke.

+0

Es hängt alles davon ab, welche Norm (en) in Ihrem Bereich sind. Wenn es immer durch ein Komma getrennt ist, benutze CHARINDEX, um die Position des Kommas und SUBSTRING() zu finden. Sie können mehr charindex() für: Doppelpunkt oder Leerzeichen einfügen, um auch andere Positionen zu finden. Das Umkehren der Zeichenfolge ist gut, um die Position vom Ende der Zeichenfolge in Ihrem Fall zu finden, die 2 Kommata mehr hat, als dass Sie eine rekursive oder Schleife betrachten müssen. Aber Sie haben die wichtigsten 2 Funktionen, also versuchen Sie es und schreiben Sie einige spezifische Versuche, die Sie Fragen haben. Auch LTRIM(), RTRIM(), LINKS() und RECHTS() werden nützlich sein – Matt

+0

Sorry, ich bin ein Neuling auf SQL. Hoffe, ich könnte mehr Beispiele für den Coding-Teil bekommen. Danke für die Antwort, ich werde es versuchen. Vielen Dank. – Danny

+0

geben Sie uns ein paar Beispielzeichenfolgen und was Sie aus ihnen abrufen möchten –

Antwort

0

Hier ist ein Beispiel, was Sie tun möchten. Sie müssen dies möglicherweise ein wenig ändern, da ich nicht viele Beispieldaten habe, um weiterzumachen.

Testdaten

IF OBJECT_ID('tempdb..#TempData') IS NOT NULL DROP TABLE #TempData 
GO 
CREATE TABLE #TempData (Notes varchar(100)) 
INSERT INTO #TempData (Notes) 
VALUES 
('This is the first "ABC:5/52 string *back, orders received') 
,('*back, orders receivedThis"ABC:5/52 string is the second one') 
,('You guessed it, this *back, orders received is the third "ABC:5/52 string') 

Abfrage

SELECT 
CHARINDEX('*',Notes) AsteriskLocation 
,SUBSTRING(Notes,CHARINDEX('*',Notes)+1,4) AfterAsterisk 
,CHARINDEX(':',Notes) ColonLocation 
,SUBSTRING(Notes,CHARINDEX(':',Notes)+1,4) AfterColon 
FROM #TempData 

Ergebnis

AsteriskLocation AfterAsterisk ColonLocation AfterColon 
36     back   23    5/52 
1     back   31    5/52 
22     back   62    5/52 

ich die Standorte getrennt verlassen habe, so dass Sie sehen können, wie sie in der Abfrage verwendet sind. Sie können auch nach Strings suchen, indem Sie die gleiche Methode verwenden.