Let\'s say I have 2 tables like this :
Job Offers:
+----+------------+------------+
| ID | Name | Categories |
+----+--------
If you can live with one row per category then this will work:
select jo.*, c.name as category
from joboffers jo join
categories c
on ',' + jo.categories + ',' like '%,' + cast(c.id) + ',%';
Re-aggregating them into a string is painful in SQL Server (but very possible).
Note: you have a really, really bad data structure. So you should fix it as mentioned in a comment. Why is it bad?
From SQL SERVER 2016 we can use sql inbuilt function STRING_SPLIT as below :
SELECT * FROM JobOffers as j
outer apply STRING_SPLIT(j.[Categories], ',') s
left join dbo.Categories as c on c.CategoryID =s.value
You can greatly simplify this to something like this.
SELECT
O.[ID] AS OfferID,
O.[Name] AS OfferName,
c.[CategoryName] AS CategoryName,
c.[CategoryID] AS CategoryID
FROM
JobOffers AS O
outer apply [dbo].[Split](O.[Categories], ',') s
left join Categories as C on c.CategoryID = s.Items
The concern I have is your splitter. If there is more than a single select statement the performance is going to suffer horribly. For a good explanation of various splitters available you can visit this article.
http://sqlperformance.com/2012/07/t-sql-queries/split-strings