两个函数介绍
charindex(要查找的表达式1,表达式2) : 返回值为表达式1在表达式2中的下标,未找到则返回0。(sql的下标是从1开始的)
例如: select charindex(‘sql’,‘sql server 2012’) 返回1
stuff(要替换的表达式1, 起始位置, 替换长度, 替换的表达式2) : 返回值是替换后的字符串 。
例如: select STUFF(‘111’,1,1,‘2’) 意思是 从下标1 开始,替换1个长度的字符,由1替换为2。结果返回 211 。一般stuff 会和for xml path(‘’) 连用。
例一:
SELECT
[Series] -- 该字段存储格式为 7,8,9,11,10,12 ,数据类型为nvarchar ,页面显示需要翻译成中文
,Series_Chinese = stuff((select ',' + Val from a where charindex(','+ltrim(id)+',',','+ Series + ',') > 0 for xml path('') ), 1, 1, '')
FROM b
例二:例如泛微OA多人力资源字段,text类型,存储的内容为:7,8,9,11,10,12 ;此字段存储的是人员的id并且用逗号分隔,现需要根据此字段查询出人员的姓名并同样以逗号分隔显示;之所以convert转成varchar是因为泛微OA的多人力资源为text,无法与varchar进行add操作;a.bgr 是多人的id格式为:7,8,9,11,10,12 users_name为转换后的查询内容格式为:张三,李四,王五,赵六,马大哈,小白
SELECT
a.bgr as users_id,
stuff((select ',' + CONVERT(VARCHAR(200),lastname) from hrmresource where charindex(','+ltrim(id)+',',','+ CONVERT(VARCHAR(200),a.bgr) + ',') > 0 for xml path('') ), 1, 1, '') as users_name
FROM formtable_main_10 as a