Reputation: 29
Column name Subject
Value = Something TEST001 something
I need to get TEST001 from "Something TEST001 Something"
If there are spaces or any specials characters after the 1 of TEST001 they will be removed.
I only have this
SELECT
Subject
, REPLACE(SUBSTRING(MailSubject, CHARINDEX('TEST', MailSubject), LEN(MailSubject)),'', '') AS Assingment
FROM
AssingmentEmail
The numbers from TEST001
can be more but if there are any spaces or non numeric it will be removed.
Upvotes: 1
Views: 106
Reputation: 35790
Based on comments here is edited solution:
DECLARE @t TABLE(v VARCHAR(100))
INSERT INTO @t VALUES
('Something TEST001 something'),
('Something [TEST0001] something'),
('Something TEST001 something 123 something'),
('Something {TEST0001} something 123 something')
;WITH cte AS(SELECT SUBSTRING(v, CHARINDEX('TEST', v), LEN(v)) AS v FROM @t)
SELECT SUBSTRING(v, 1, PATINDEX('%[^TEST0-9]%', v) - 1) AS v FROM cte
Output:
v
TEST001
TEST0001
TEST001
TEST0001
Explanation:
In cte
you are selecting substrings:
TEST001 something
TEST0001] something
TEST001 something 123 something
TEST0001} something 123 something
Then you are searching for first occurrence of symbol that is not T E S T 0 1 2 3...9
with %[^TEST0-9]%
and get substring till that symbol.
Upvotes: 1
Reputation: 15061
Use a combination of SUBSTRING
, CHARINDEX
& LEN
. Also works regardless of how many digits are in the TESTXXXX.
SELECT MailSubject,
LEFT(SUBSTRING([MailSubject], CHARINDEX('TEST', [MailSubject]), LEN([MailSubject])), CHARINDEX(' ', SUBSTRING([MailSubject],
CHARINDEX('TEST', [MailSubject]), LEN([MailSubject]))) - 1) AS [MailSubject]
FROM AssingmentEmail
INPUT:
MailSubject
something TEST001 something
something TEST201 something
something TEST20122 something
something TEST601 something
OUTPUT:
MailSubject MailSubject
something TEST001 something TEST001
something TEST201 something TEST201
something TEST20122 something TEST20122
something TEST601 something TEST601
SQL FIDDLE: http://sqlfiddle.com/#!3/93660d/1/0
Upvotes: 0
Reputation: 1271151
I would do this using a subquery. It is easier to handle the intermediate results. First, get rid of the part before the "TEST". Then, take the result up the first first space:
select left(ms1, charindex(' ', ms1)) as TestStuff
from (select stuff(MailSubject, 1, charindex(' TEST', MailSubject), '') as ms1
from assignment email
) ae
Upvotes: 0