sqlserver-当一个字段以逗号隔开存多个id,用sql取这个id对应的名字,
formtable_main_143 存储数据格式如下 id为主键(字段类型int),zrr1为HrmResource中的id组成(字段类型text)
HrmResource表数据如下 id字段类型int lastname字段类型varchar(1000)
在网上找到的方法:SELECT a.id,a.zrr1 ,'显示列' = STUFF(( SELECT ',' + b.lastname
FROM HrmResource b
where PATINDEX('%,' + RTRIM(b.id) + ',%',',' + CAST(a.zrr1 as varchar) + ',')>0
ORDER BY PATINDEX('%,' + RTRIM(b.id) + ',%',',' + CAST(a.zrr1 as varchar) + ',')
FOR XML PATH('')), 1, 1,''
)
FROM formtable_main_143 a
遇到的问题:
http://t.csdn.cn/4H0Z3
自定义函数 字符串分割为list 然后 使用 in配合stuff 函数
-- 字符串指定字符分割为list
CREATE FUNCTION [dbo].[splitl] (
@String VARCHAR(MAX),
@Delimiter VARCHAR(MAX)
) RETURNS @temptable TABLE (items VARCHAR(MAX)) AS
BEGIN
DECLARE @idx INT=1
DECLARE @slice VARCHAR(MAX)
IF LEN(@String) < 1 OR LEN(ISNULL(@String,'')) = 0
RETURN
WHILE @idx != 0
BEGIN
SET @idx = CHARINDEX(@Delimiter,@String)
IF @idx != 0
SET @slice = LEFT(@String,@idx - 1)
ELSE
SET @slice = @String
IF LEN(@slice) > 0
INSERT INTO @temptable(items) VALUES(@slice)
SET @String = RIGHT (@String, LEN(@String) - @idx)
IF LEN(@String) = 0
BREAK
END
RETURN
END
GO
-- 调用方式
SELECT * FROM dbo.splitl('aaa|bbb|ccc','|')