Sql Server的Cross Apply用法

apply有两种形式: cross apply 和 outer apply

区别在于指定OUTER,意味着结果集中将包含使右表表达式为空的左表表达式中的行

而指定CROSS,则相反,结果集中不包含使右表表达式为空的左表表达式中的行。

零、cross apply的原理:

<left_table>  {cross|outer} apply <right_table>

它是先得出右表里的数据,然后把此数据一条一条的放入左表表式中,分别得出结果集,最后把结果集整合到一起就是最终的返回结果集了

详解:(拆分后的数据 ,像for循环一样 ,一条一条的进入到left表中, 然后返回一个集合 ,最后把所有的集合整合到一块  就是最终的结果

一、split 后显示列表数据

--值班表  split 后列表
select *from  (select MineOnDuty  from LeaderOnDutyDayReport where LEFT(DayDate,7)='2021-09' ) AS t 
CROSS APPLY dbo.SplitString( t.MineOnDuty, '',1) AS fs  

二、split 后统计数据

--值班表 split 后统计数据
select Value Leader,count(1) NumZB from  (select MineOnDuty  from LeaderOnDutyDayReport where LEFT(DayDate,7)='2021-09' ) AS t 
CROSS APPLY dbo.SplitString( t.MineOnDuty, '',1) AS fs  group by Value

 三、SplitString函数

该函数用于将数据库中字符串根据特定字符进行分割成数组,SQL中无split函数,该函数实现的就是C#程序中split功能。

select * from SplitString("需要拆分字符串", '特定字符',1)

Create function [dbo].[SplitString]
(
    @Input nvarchar(max),
    @Separator nvarchar(max)=',', 
    @RemoveEmptyEntries bit=1 
)
returns @TABLE table 
(
    [Id] int identity(1,1),
    [Value] nvarchar(max)
) 
as
begin 
    declare @Index int, @Entry nvarchar(max)
    set @Index = charindex(@Separator,@Input)

    while (@Index>0)
    begin
        set @Entry=ltrim(rtrim(substring(@Input, 1, @Index-1)))
        
        if (@RemoveEmptyEntries=0) or (@RemoveEmptyEntries=1 and @Entry<>'')
            begin
                insert into @TABLE([Value]) Values(@Entry)
            end

        set @Input = substring(@Input, @Index+datalength(@Separator)/2, len(@Input))
        set @Index = charindex(@Separator, @Input)
    end
    
    set @Entry=ltrim(rtrim(@Input))
    if (@RemoveEmptyEntries=0) or (@RemoveEmptyEntries=1 and @Entry<>'')
        begin
            insert into @TABLE([Value]) Values(@Entry)
        end

    return
end

 

posted @ 2021-09-14 22:21  laoyang01  阅读(5012)  评论(0编辑  收藏  举报