cross apply和表值函数进行关联查询

本文介绍了一种通过SQL函数实现的将员工多个爱好字段拆分为单独记录的方法,以便于进行统计分析。提供了两种实用的字符串分割函数及应用示例。

目前场景是有一个兴趣爱好类型表和一个员工爱好表,员工爱好表中的爱好一列,如果这个员工有多个爱好,那么就将这些爱好放到一条记录当中,爱好之间用逗号隔开,现在需求是要将每个员工的这些爱好分隔成一条条记录查询出来,从而可以例如做员工爱好统计等应用。

爱好类型表 t_a

员工爱好表 t_b

需要的结果是

创建一个分隔字符串的表值函数

create function [dbo].[splitIDs](
    @Ids nvarchar(1000),
    @split_char nvarchar(10)
)
returns @t_id TABLE (id bigint)
as
begin
    declare @i int,@j int,@l int,@v bigint;
    set @i = 0;
    set @j = 0;
    set @l = len(@Ids);
    while(@j < @l)
    begin
       set @j = charindex(@split_char,@Ids,@i+1);
       if(@j = 0) set @j = @l+1;
       set @v = cast(SUBSTRING(@Ids,@i+1,@j-@i-1) as bigint);
       INSERT INTO @t_id VALUES(@v)
       set @i = @j;
    end
    return;
end

GO

采用下面的语句即可得到期望的结果

select 
    aid = t_a.id
    ,aname = t_a.name
    ,bid = t_b.id,t_b.name
from t_b
cross apply splitIDs(a_ids,',') tbl_Ids
INNER JOIN t_a ON tbl_Ids .id = t_a.id

分割字符串函数的另一种写法

USE [master]
GO
/****** Object:  UserDefinedFunction [dbo].[Split]    Script Date: 05/08/2014 14:45:25 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER   FUNCTION [dbo].[Split]   
(   
@c VARCHAR(MAX) ,   
@split VARCHAR(50)   
)   
RETURNS @t TABLE ( col VARCHAR(50) )   
AS  
BEGIN  
    WHILE ( CHARINDEX(@split, @c) <> 0 )   
        BEGIN  
            INSERT  @t( col )   
            VALUES  ( SUBSTRING(@c, 1, CHARINDEX(@split, @c) - 1) )   
            SET @c = STUFF(@c, 1, CHARINDEX(@split, @c), '')   
        END  
    INSERT  @t( col ) VALUES  ( @c )   
    RETURN  
END

-------------------------------END OF FUNCTION----------------------------------------------


使用方法

select * from Split('1,2,3',',')




评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值