从数据库表列中的逗号分隔字符串中获取记录

时间:2015-03-16 10:25:53

标签: sql sql-server

我有一张桌子,其中有一个字段" 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
....

如何准备查询?

2 个答案:

答案 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)) + '-';

每个员工生成一行。你应该远离逗号分隔的列表,所以现在似乎已经足够了。