I am having trouble extracting a selection of characters from a string
Here is a snippet of values from a field called 'TXT':
And I wish to extract the F333330, F010122, F10101 and F27272
I have experimented with charindex, left/right, and substring but havent been able to crack it
SELECT TXT ,
CASE WHEN CHARINDEX('-',(SUBSTRING(txt,CHARINDEX('-',txt,2)+1,99)))=0
THEN
LTRIM(RTRIM(SUBSTRING(txt,CHARINDEX('-',txt,2)+1,99)))
ELSE
LTRIM(RTRIM(SUBSTRING(txt,CHARINDEX('-',txt,2) +1,CHARINDEX('-',SUBSTRING(txt,CHARINDEX('-',txt,2)+1,99))-1)))
END
FROM #test
My desired row set is to just show:
I have tried other variations of substring without a case statement but had no luck. Can anyone help?
Thanks, Nuems
Try this?
DECLARE @test TABLE (TXT VARCHAR(500));
INSERT INTO @test SELECT 'FNP, 10/09/2018,PO-00123456 - F333330- FA_002056' UNION ALL
SELECT 'FNP, 18-09-2018,PO-00987654 - F010122- FA_002056' UNION ALL
SELECT 'FNP, 28/12/2017,PO-00123987 - F10101' UNION ALL
SELECT 'FNP, 13-03-2019,FRPO-35412 - F27272-ANNUL PO';
SELECT SUBSTRING(TXT, PATINDEX('%- F%', TXT) + 2, CASE WHEN CHARINDEX('-', SUBSTRING(TXT, PATINDEX('%- F%', TXT) + 2, 99)) = 0 THEN 99 ELSE CHARINDEX('-', SUBSTRING(TXT, PATINDEX('%- F%', TXT) + 2, 99)) - 1 END)
FROM @test;
...or, with that one extra row:
DECLARE @test TABLE (TXT VARCHAR(500));
INSERT INTO @test SELECT 'FNP, 10/09/2018,PO-00123456 - F333330- FA_002056' UNION ALL
SELECT 'FNP, 18-09-2018,PO-00987654 - F010122- FA_002056' UNION ALL
SELECT 'FNP, 28/12/2017,PO-00123987 - F10101' UNION ALL
SELECT 'FNP, 13-03-2019,FRPO-35412 - F27272-ANNUL PO' UNION ALL
SELECT 'FNP, 11/10/2017,PO-00112311 - F32121 regul po 112311';
SELECT SUBSTRING(TXT, PATINDEX('%- F%', TXT) + 2,
CASE
WHEN CHARINDEX('-', SUBSTRING(TXT, PATINDEX('%- F%', TXT) + 2, 99)) != 0 THEN CHARINDEX('-', SUBSTRING(TXT, PATINDEX('%- F%', TXT) + 2, 99)) - 1
WHEN CHARINDEX(' ', SUBSTRING(TXT, PATINDEX('%- F%', TXT) + 2, 99)) != 0 THEN CHARINDEX(' ', SUBSTRING(TXT, PATINDEX('%- F%', TXT) + 2, 99)) - 1
ELSE 99
END)
FROM @test;
...or bonus with less repetition (uses a CTE):
WITH x AS (
SELECT SUBSTRING(TXT, PATINDEX('%- F%', TXT) + 2, 99) AS TXT FROM @test)
SELECT SUBSTRING(TXT, 0,
CASE
WHEN CHARINDEX('-', TXT) != 0 THEN CHARINDEX('-', TXT) - 1
WHEN CHARINDEX(' ', TXT) != 0 THEN CHARINDEX(' ', TXT) - 1
ELSE 99
END)
FROM x;