首页 > 解决方案 > 检查具有多列结果的字符串

问题描述

我试图在标量函数中浓缩我已经拥有的东西。在 PERSONS 表中,我有多个人员在一个部门担任多个角色。表 PERSONS 如下所示:

id      name            dept         role     
-------------------------------------------
1       John       studentaffairs    Coder    
2       Joe        studentaffairs    Intern
3       Charlie    studentaffairs     Dist
4       Dan        studentaffairs     Dist
5       Rita       studentaffairs     Lead
6       Nuna       studentaffairs     Lead

我的函数识别这个人是谁(INPUT),并返回一个关于他们在部门中一般担任什么角色的紧凑视图。

alter function get_simplifiedrolesfordistribution(@name nvarchar(30))
returns varchar(max)
As
Begin
    DECLARE @AudienceTag varchar(255);

    select @AudienceTag = ('studentaffairs, 
                            studentaffairs-'+ IIF(c.role = 'Coder', 'general', '')+
                                              IIF(c.role = ' Volunteer','general','')+
                                              IIF(c.role = ' Intern','summer','')+
                                              IIF(c.role = ' Dist','seasonal','')+
                                              IIF(c.role = ' Lead','manager','')
                          )
    from PERSONS c
    where c.name = @name ;

    Return @AudienceTag;
End;

测试案例:

输入 - 努娜

结果 - studentaffairs, studentaffairs-manager

我的问题:有没有一种在sql中开发标量函数的简化方法?我有多个像上面那个更大的表。可以键入所有不同的角色并将它们归入一个通用类别,但这并不理想。

谢谢你的帮助。

标签: sqlsql-server

解决方案


简单CASE的表达就可以了:

CONCAT('studentaffairs', dept,
        CASE WHEN c.role IN ('Coder', 'Volunteer') THEN 'general'
             WHEN c.role = 'Intern' THEN 'summer'
             WHEN c.role = 'Dist' THEN 'seasonal'
             WHEN c.role = 'Lead' THEN 'manager'
        END
      )

然后使用APPLY

SELECT c.*, cc.AudienceTag
FROM PERSONS c CROSS APPLY
    ( VALUES (CONCAT('studentaffairs ,', 'studentaffairs - ', 
                      CASE WHEN c.role IN ('Coder', 'Volunteer') THEN 'general'
                           WHEN c.role = 'Intern' THEN 'summer'
                           WHEN c.role = 'Dist' THEN 'seasonal'
                           WHEN c.role = 'Lead' THEN 'manager'
                      END
                    )
             )
    ) cc(AudienceTag)
WHERE c.name = @name;

推荐阅读