I’ve got the following code. It returns the correct result for the first two test strings, where it should return the text between the two ****.
The 3rd string returns ” abcd two two ****” rather than ” abcd two two ” The 4th string returns “Invalid length parameter passed to the LEFT or SUBSTRING function.”
Any ideas?
x
WITH yourTable AS (
SELECT '**** mary had a little lamb****' AS TestString UNION ALL
SELECT '**** humpy dumpty had a great fall**** All the king''s horses and all the king''s men' UNION ALL
SELECT 'bla **** abcd two two **** dfdfdfd' UNION ALL
SELECT 'test'
)
SELECT
TestString,
SUBSTRING(TestString,
CHARINDEX('****', TestString) + 4,
CHARINDEX('****', TestString, CHARINDEX('****', TestString) + 1) - 5) AS contents
FROM yourTable;
Advertisement
Answer
The search terms are four asterisks. This approach uses CHARINDEX, once forwards to find the first set, and then with REVERSE to find the last occurrence.
;WITH yourTable AS (
SELECT '**** mary had a little lamb****' AS TestString UNION ALL
SELECT '**** humpy dumpty had a great fall**** All the king''s horses and all the king''s men' UNION ALL
SELECT 'bla **** abcd two two **** dfdfdfd' UNION ALL
SELECT 'test'
)
SELECT
TestString,
trim(case when cx.cndx=4 then TestString
else substring(TestString, cx.cndx, (cx.len_t-cx.cndx)-cx.rndx-2) end) MiddleString
FROM yourTable
cross apply
(select len(TestString) len_t,
charindex('****', TestString)+4 cndx,
charindex('****', reverse(TestString)) rndx) cx;
Output
TestString MiddleString
**** mary had a little lamb**** mary had a little lamb
**** humpy [shortened] fall**** All humpy dumpty had a great fall
bla **** abcd two two **** dfdfdfd abcd two two
test test