There are 2 possibilities:
1) Using PATINDEX() AND SUBSTRING() functions, but it's not optimized
2) Using Regular Expressions in T-SQL
Ad 1)
PATINDEX[
^]
SUBSTRING[
^]
Pattern Matching With SQL[
^]
For example, below code:
DECLARE @tbl TABLE(Narration NVARCHAR(100))
INSERT INTO @tbl (Narration)
VALUES('two coll-EntryNo-1-NIRMLTW02140010')
INSERT INTO @tbl (Narration)
VALUES('EntryNo 54 For Amount towards & received for CDDHLTW1203280005')
INSERT INTO @tbl (Narration)
VALUES('CASH COLLECTION-EntryNo-1-PONAMPJ10210029')
INSERT INTO @tbl (Narration)
VALUES('Being Charges Entry For Loan - RNGTAPJ1204020026 - RGT1274')
INSERT INTO @tbl (Narration)
VALUES('amt rceived pack 20686-EntryNo-1-GNGE1PJ1203300016')
DECLARE @tmp TABLE (Narration NVARCHAR(100), Position INT, Code NVARCHAR(100))
DECLARE @pattern NVARCHAR(30)
SET @pattern = '%[^0-9][A-Z][^-][^ ][0-9]%[^A-Za-z]%'
INSERT INTO @tmp (Narration, Position, Code)
SELECT Narration, Position, Code
FROM (
SELECT Narration, PATINDEX(@pattern, Narration) + 1 AS Position, SUBSTRING(Narration, PATINDEX(@pattern, Narration)+1, LEN(Narration) -PATINDEX(@pattern, Narration))AS Code
FROM @tbl
) AS T
SELECT *
FROM @tmp
returns:
RowNo | Narration | Code |
---|
1 | amt rceived pack 20686-EntryNo-1-GNGE1PJ1203300016 | No-1-GNGE1PJ1203300016 |
2 | Being Charges Entry For Loan - RNGTAPJ1204020026 - RGT1274 | - RGT1274 |
3 | CASH COLLECTION-EntryNo-1-PONAMPJ10210029 | No-1-PONAMPJ10210029 |
4 | EntryNo 54 For Amount towards & received for CDDHLTW1203280005 | o 54 For Amount towards & received for CDDHLTW1203280005 |
5 | two coll-EntryNo-1-NIRMLTW02140010 | No-1-NIRMLTW02140010 |
Not satisfying? No matter. There is still hope and... solution. ;)
After that you need to parse ' ' (spaces) and '-' using
CTE[
^] to get correct code.
Here is an example:
CREATE TABLE #tmp (RowNo INT, Code NVARCHAR(100))
;WITH myCodes AS
(
SELECT RowNo, LTRIM(RTRIM(LEFT(Code, CHARINDEX(' ',Code)-1))) AS myCode,
LTRIM(RTRIM(RIGHT(Code, LEN(Code) - CHARINDEX(' ',Code)))) AS Remainder
FROM @tmp
WHERE NOT Code IS NULL AND CHARINDEX(' ',Code)>0
UNION ALL
SELECT RowNo, LTRIM(RTRIM(LEFT(Remainder, CHARINDEX(' ',Remainder)-1))) AS myCode,
LTRIM(RTRIM(RIGHT(Remainder, LEN(Remainder) - CHARINDEX(' ',Remainder)))) AS Remainder
FROM myCodes
WHERE NOT Remainder IS NULL AND CHARINDEX(' ',Remainder)>0
UNION ALL
SELECT RowNo, Remainder AS myCode, NULL AS Remainder
FROM myCodes
WHERE NOT Remainder IS NULL AND CHARINDEX(' ',Remainder)=0
)
INSERT INTO #tmp (RowNo, Code)
SELECT RowNo, myCode AS Code
FROM myCodes
WHERE LEN(myCode)>14 AND LEN(myCode)<21
;WITH newCodes AS
(
SELECT RowNo, LTRIM(RTRIM(LEFT(Code, CHARINDEX('-',Code)-1))) AS myCode,
LTRIM(RTRIM(RIGHT(Code, LEN(Code) - CHARINDEX('-',Code)))) AS Remainder
FROM @tmp
WHERE NOT Code IS NULL AND CHARINDEX('-',Code)>0
UNION ALL
SELECT RowNo, LTRIM(RTRIM(LEFT(Remainder, CHARINDEX('-',Remainder)-1))) AS myCode,
LTRIM(RTRIM(RIGHT(Remainder, LEN(Remainder) - CHARINDEX('-',Remainder)))) AS Remainder
FROM newCodes
WHERE NOT Remainder IS NULL AND CHARINDEX('-',Remainder)>0
UNION ALL
SELECT RowNo, Remainder AS myCode, NULL AS Remainder
FROM newCodes
WHERE NOT Remainder IS NULL AND CHARINDEX('-',Remainder)=0
)
INSERT INTO #tmp (RowNo, Code)
SELECT RowNo, myCode AS Code
FROM newCodes
WHERE LEN(myCode)>14 AND LEN(myCode)<21
SELECT *
FROM #tmp
ORDER BY RowNo
DROP TABLE #tmp
results:
RowNo | Code |
---|
1 | GNGE1PJ1203300016 |
3 | PONAMPJ10210029 |
4 | CDDHLTW1203280005 |
5 | NIRMLTW02140010 |
Ad 2)
Regular Expressions Make Pattern Matching And Data Extraction Easier[
^]
http://blogs.msdn.com/b/khen1234/archive/2005/05/11/416392.aspx[
^]
xp_pcre - Regular Expressions in T-SQL[
^]