sql - 检查具有多列结果的字符串
问题描述
我试图在标量函数中浓缩我已经拥有的东西。在 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中开发标量函数的简化方法?我有多个像上面那个更大的表。可以键入所有不同的角色并将它们归入一个通用类别,但这并不理想。
谢谢你的帮助。
解决方案
简单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;
推荐阅读
- android - 在 Kotlin 中设置和读取 EditText
- javascript - 函数返回未定义而不是请求的结果
- c++ - Xcode 错误:“工作目录不存在”
- c# - Pulumi C#:将堆栈输出标记为机密
- javascript - 如何在 Firebase 中搜索单个对象,然后在不使用 forEach 的情况下对其进行处理?
- javascript - 如何从内到外迭代 Javascript 对象
- excel - 如何根据列中的值标准插入行数
- javascript - 将地图转换为数组 - Javascript
- windows - 使用 Windows 批处理脚本移动桌面上除特定文件夹之外的所有内容
- markdown - 如何在 Docusaurus 中渲染浏览器