Find Manager In A Comma-separated List
Solution 1:
WHERE','+ Manager +','LIKE'%,Jim,%'Or I suppose to match your actual code:
WHERE','+ Manager +','LIKE'%,'+@Manager+',%'Note that your design is extremely flawed. There is no reason you should be storing names in this table at all, never mind a comma-separated list of any data points. These facts are important on their own, so treat them that way!
CREATETABLE dbo.Managers
(
ManagerID INTPRIMARY KEY,
Name NVARCHAR(64) NOTNULLUNIQUE, ...
);
CREATETABLE dbo.Projects
(
ProjectID INTPRIMARY KEY,
Name NVARCHAR(64) NOTNULLUNIQUE, ...
);
CREATETABLE dbo.ProjectManagers
(
ProjectID INTNOTNULLFOREIGN KEY REFERENCES dbo.Projects(ProjectID),
ManagerID INTNOTNULLFOREIGN KEY REFERENCES dbo.Managers(ManagerID)
);
Now to set up the sample data you mentioned:
INSERT dbo.Managers(ManagerID, Name)
VALUES(1,N'John'),(2,N'Jim'),(3,N'Julie');
INSERT dbo.Projects(ProjectID, Name)
VALUES(1,N'Project 1'),(2,N'Project 2');
INSERT dbo.ProjectManagers(ProjectID,ManagerID)
VALUES(1,1),(1,2),(2,2),(2,3);
Now to find all the projects Jim is managing:
DECLARE @Manager NVARCHAR(32) = N'Jim';SELECT p.ProjectID, p.Name
FROM dbo.Projects AS p
INNER JOIN dbo.ProjectManagers AS pm
ON p.ProjectID = pm.ProjectID
INNER JOIN dbo.Managers AS m
ON pm.ManagerID = m.ManagerID
WHERE m.name = @Manager;
Or you can even manually short circuit a bit:
DECLARE@Manager NVARCHAR(32) = N'Jim';
DECLARE@ManagerIDINT;
SELECT@ManagerID= ManagerID
FROM dbo.Managers
WHERE Name =@Manager;
SELECT p.ProjectID, p.Name
FROM dbo.Projects AS p
INNERJOIN dbo.ProjectManagers AS pm
ON p.ProjectID = pm.ProjectID
WHERE pm.ManagerID =@ManagerID;
Or even more:
DECLARE@Manager NVARCHAR(32) = N'Jim';
DECLARE@ManagerIDINT;
SELECT@ManagerID= ManagerID
FROM dbo.Managers
WHERE Name =@Manager;
SELECT ProjectID, Name
FROM dbo.Projects AS p
WHEREEXISTS
(
SELECT1FROM dbo.ProjectManagers AS pm
WHERE pm.ProjectID = p.ProjectID
AND pm.ManagerID =@ManagerID
);
As an aside, I really, really, really hope the DISTINCT in your original query is unnecessary. Do you really have more than one project with the same name and ID?
Solution 2:
In a WHERE clasue a = operator looks for an exact match. You can use a LIKE with wildcards for a partial match.
where Manager LIKE'%Jim%'Solution 3:
You may try the following:
SELECTDISTINCTID,
ManagerFROMProjectsWHERE
(
(Manager LIKE @Manager + ',*') OR
(Manager LIKE '*,' + @Manager) OR
(Manager = @Manager)
)
That should cover both names and surnames, while still searching for literal values. Performance can be a problem however, depending on table
Solution 4:
please tried with below query
selectdistinct ID,Manager from Projects where replace('#$#'+ Manager +'#$#', ',', '#$#') like'%Jim%'
Post a Comment for "Find Manager In A Comma-separated List"