Here you go
declare @t table (resolution nvarchar(100))
Insert into @t values ('1366 X 768 @ 60 Hz'),
('1024 X 768 @ 60 Hz'),
('640 X 480 @ 70 Hz');
SELECT LEFT(Resolution, CHARINDEX('X', Resolution) - 1) [1St],
SUBSTRING(Resolution, CHARINDEX('X', Resolution)+1, CHARINDEX('@', Resolution)-
CHARINDEX('X', Resolution)-2) [2nd],
SUBSTRING(Resolution, CHARINDEX('@', Resolution)+1, CHARINDEX('H', Resolution)-
CHARINDEX('@', Resolution)-2) [3rd]
FROM @t;
Online demo
Or more better(without white spaces)
SELECT LEFT(Resolution, CHARINDEX('X', Resolution) - 2) [1St],
SUBSTRING(Resolution,
CHARINDEX('X', Resolution)+2,
CHARINDEX('@', Resolution)- CHARINDEX('X', Resolution)-3
) [2nd],
SUBSTRING(Resolution,
CHARINDEX('@', Resolution)+2,
CHARINDEX('H', Resolution) - CHARINDEX('@', Resolution)-3
) [3rd]
FROM @t
If you want 'Hz' to be in the third column then
SELECT LEFT(Resolution, CHARINDEX('X', Resolution) - 2) [1St],
SUBSTRING(Resolution,
CHARINDEX('X', Resolution)+2,
CHARINDEX('@', Resolution)- CHARINDEX('X', Resolution)-3
) [2nd],
SUBSTRING(Resolution,
CHARINDEX('@', Resolution)+2,
LEN(Resolution)
) [3rd]
FROM @t;
Also, you could use PARSENMAE() function (as mkrabbani provide)to return both results as the following:
With 'Hz'
SELECT Resolution,
PARSENAME(Res, 3) Fst,
PARSENAME(Res, 2) Snd,
PARSENAME(Res, 1) Thd
FROM
(
VALUES
('1366 X 768 @ 60 Hz'),
('1024 X 768 @ 60 Hz'),
('640 X 480 @ 70 Hz')
) T(Resolution)
CROSS APPLY
(
SELECT REPLACE(REPLACE(T.Resolution, ' X ', '.'), ' @ ', '.') Res
) TT;
Without 'Hz':
SELECT Resolution,
PARSENAME(Res, 3) Fst,
PARSENAME(Res, 2) Snd,
PARSENAME(Res, 1) Thd
FROM
(
VALUES
('1366 X 768 @ 60 Hz'),
('1024 X 768 @ 60 Hz'),
('640 X 480 @ 70 Hz')
) T(Resolution)
CROSS APPLY
(
SELECT REPLACE(REPLACE(REPLACE(T.Resolution, ' X ', '.'), ' @ ', '.'), 'Hz', '') Res
) TT;
Demo for the last 3 queries.
substringis the length, not the end of the substring to be returned.charindex('@', resolution) + 1is not the length of the vertical resolution ('768').