'SQL matching specific pattern value

I want to join tables Department and Employee and display the results by matching text value of column DEPART and NAME.

DEPART has a pattern DEPARTMENT-NAME so it is possible to just match -NAME with values of column NAME?

Table Department:

ID DEPART DESC
A00 MARKETING-BOB MARKETING
A01 MARKETING-BOB MARKETING
A02 MARKETING-BOB MARKETING
A03 MARKETING-BOB MARKETING

Table Employee:

ID NAME
A00 STUART, BOB
A01 STUART, BOB
A02 STUART, BOB
A03 STUART, BOB
A00 ELANE, CASTLE JOE
A01 ELANE, CASTLE JOE
A02 ELANE, CASTLE JOE
A03 ELANE, CASTLE JOE

Result :

ID DEPART NAME
A00 MARKETING-BOB STUART, BOB
A01 MARKETING-BOB STUART, BOB
A02 MARKETING-BOB STUART, BOB
A03 MARKETING-BOB STUART, BOB


Solution 1:[1]

Checking if the name of the employee is like the last part of the department's name.

SELECT 
  dep.ID
, dep.DEPART
, emp.NAME
FROM Employee emp
JOIN Department dep 
  ON dep.ID = emp.ID
 AND emp.NAME LIKE '%, '+RIGHT(dep.DEPART,PATINDEX('%_-%',REVERSE(dep.DEPART)))
ID DEPART NAME
A00 MARKETING-BOB STUART, BOB
A01 MARKETING-BOB STUART, BOB
A02 MARKETING-BOB STUART, BOB
A03 MARKETING-BOB STUART, BOB

Solution 2:[2]

There's a high risk when you are doing fuzzy matching on potentially ambiguous data (is there more than one Bob?), but the following is a start:

DECLARE @Department TABLE(ID VARCHAR(10), DEPART VARCHAR(100), [DESC] VARCHAR(100))
INSERT @Department
VALUES
    ('A00', 'MARKETING-BOB', 'MARKETING'),
    ('A01', 'MARKETING-BOB', 'MARKETING'),
    ('A02', 'MARKETING-BOB', 'MARKETING'),
    ('A03', 'MARKETING-BOB', 'MARKETING'),
    ('A02', 'ACCOUNTING-JOE', 'ACCOUNTING'),
    ('A03', 'ACCOUNTING-CASTLE JOE', 'FINANCE')

DECLARE @Employee TABLE(ID VARCHAR(10), NAME VARCHAR(100))
INSERT @Employee
VALUES
    ('A00', 'STUART, BOB'),
    ('A01', 'STUART, BOB'),
    ('A02', 'STUART, BOB'),
    ('A03', 'STUART, BOB'),
    ('A00', 'ELANE, CASTLE JOE'),
    ('A01', 'ELANE, CASTLE JOE'),
    ('A02', 'ELANE, CASTLE JOE'),
    ('A03', 'ELANE, CASTLE JOE')

SELECT D.*, E.NAME
FROM @Department D
--CROSS APPLY (SELECT Name = REPLACE(D.DEPART, 'MARKETING-', '')) DN
--CROSS APPLY (SELECT Name = REPLACE(D.DEPART, D.[DESC] + '-', '')) DN
CROSS APPLY (SELECT Name = STUFF(D.DEPART, 1, NULLIF(CHARINDEX('-', D.DEPART), -1), '')) DN -- More generalized
JOIN @Employee E ON E.ID = D.ID
    --AND E.NAME LIKE ('% ' + DN.Name) -- Match tail following space
    AND E.NAME LIKE ('%, ' + DN.Name) -- Match tail following comma-space

Any of the cross apply extracts the name to be matched, and the LIKE attempts a pattern match the tail end of what I presume is '<last>, <first> <optional-middle>'.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 LukStorms
Solution 2