我有一张桌子,其中有一个字段" SendPDF" VARCHAR(最大值)。在该列中,我有像
这样的值3065-Employee,1206-Company Admin
3065-Employee
1206-Company Admin,265-Employee,1324-Company Admin
........
3065-Employee 这表示3065是员工的ID,1206是公司管理员的ID,其他记录的ID相同。现在我想要的是我需要根据他们的用户类型(即员工或公司管理员)获取名称。所以上述记录的结果将是
Ajay Sharma, Mahesh Singh
Ajay Sharma
Mahesh Singh, Rajesh Tiwari, Ramesh Vyas
....
如何准备查询?
答案 0 :(得分:1)
您必须用逗号分隔字符串,''然后加入你。
在SQL Server中按特定字符拆分字符串不能本地完成,您必须使用用户定义函数,互联网上有很多示例,但这里有one from Stackoverflow来帮助您入门。
你可以像这样使用它:
WITH tmp AS (
SELECT * FROM Split(SendPDF,',')
) SELECT name FROM employees JOIN tmp2 ON tmp.Item = CAST(employees.id AS VARCHAR)+'-Employee'
UNION
SELECT name FROM CompanyAdmins JOIN tmp2 ON tmp.Item = CAST(CompanyAdmins.id AS VARCHAR)+'-Company Admin'
这不是一个优雅的解决方案,它只是你可以做的事情来完成你的工作。您应该像其他人所说的那样规范化您的数据。
答案 1 :(得分:0)
您不应将这些列表存储在以逗号分隔的字段中。这些应位于带有多个列的联结表中,一个用于员工ID,另一个用于职称。 SQL有一个很好的数据类型,用于存储事物列表。它被称为表而不是字符串。
有时候,我们会遇到其他人不好的设计决定。你应该尝试解决这个问题。假设你有一个表,比如说employees
,每个员工id和nam有一行,你可以这样做:
select bt.*, e.employeename
from brokentable bt join
employees e
on ',' + bt.sendPDF like '%,' + cast(e.employeeid as varchar(max)) + '-';
每个员工生成一行。你应该远离逗号分隔的列表,所以现在似乎已经足够了。