多个Sql字段拼接为一个字段,并判断是否为空,为空时赋默认值

在这里记录一下怕后面自己忘了, 直接看代码吧 ,这是我数据库需要查询的两张表

--库区表
  select* from Reservoir

--仓库表
  select * from Warehouse

 需要的效果是将同一库区下的仓库的仓库名合并到同一字段中在进行查询,就是下图的效果

复制代码
 --将多个查询出的字段拼接到一个字段中  
select c.ReservoirID,c.ReservoirName,c.ReservoirRemark,
--在这里用到了Sql中的stuff函数
   -- STUFF字符串函数是将字符串插入到另一个字符串中。
   --它会删除开始位置第一个字符串中的指定长度的字符,然后将第二个字符串插入到开始位置的第一个字符串中
                 stuff(
                 --这里查询是需要拼接的数据并在拼接是以","隔开
                 (select ','+WarehouseName from
                 --从这个里面查询需要出拼接数据的来源并
               (select r.ReservoirID,r.ReservoirName,w.WarehouseID, w.WarehouseName from Warehouse w,Reservoir r where w.ReservoirID=r.ReservoirID ) a
                where a.ReservoirID=c.ReservoirID 
               --把得到的内容以XML的形式显示,并把把拼接的内容的第一个","去掉
                for xml path('')),1,1,'') as WRNames
                --最后把以拼接的数据和其他数据一起查出来就是了
                from (select w.WarehouseID,w.WarehouseName,w.ReservoirID,r.ReservoirName,r.ReservoirRemark from Warehouse w,Reservoir r 
                where w.ReservoirID=r.ReservoirID) c
               group by c.ReservoirID,c.ReservoirName,c.ReservoirRemark
复制代码

 但是上面这个查法会出现,如果数据没有关联上时,没有关联的数据就会直接查不出来,然后我又把方法改了一下

复制代码
    select 
      --将查出拼接的数据进行判断长度为0时
    case when  len(
    这里时上面的方法里写的查询并凭借方法
    (select stuff((select ','+WarehouseName from 
     (select r.ReservoirID,r.ReservoirName,w.WarehouseID, w.WarehouseName from Warehouse w,Reservoir r where w.ReservoirID=r.ReservoirID )
     a where a.ReservoirID=c.ReservoirID for xml path('')),1,1,'') as WRNames))=0
     --为其赋一个默认值
     then '该库区没有下属仓库'  
     --将查出拼接的数据进行判断为空时,
         else isnull(   
                   --这里时上面的方法里写的查询并凭借方法
  (select stuff(
             (select ','+WarehouseName from 
             (select r.ReservoirID,r.ReservoirName,w.WarehouseID, w.WarehouseName from Warehouse w,Reservoir r  where w.ReservoirID=r.ReservoirID ) as a 
             where a.ReservoirID=c.ReservoirID for xml path('')),1,1,'') as WRNames), 
            --条件成立时,赋默认值 
              '该库区没有下属仓库') 
              --最后进行整体查询
             end as WRNames,c.ReservoirID,c.ReservoirName,c.ReservoirRemark from 
                 (select * from Reservoir r ) as c
             group by c.ReservoirID,c.ReservoirName,c.ReservoirRemark
复制代码

 

最后得到结果就是我需要的结果

 此查询关键在于STUFF() 函数用于删除指定长度的字符,并可以在指定的起点处插入另一组字符,一般使用为:STUFF(字符串,从1开始计算字符开始位置,要删除的字符数,要重新插入的字符串)

 

STUFF('测试添加的',3,2,'修改')--测试修改的

 

作者:lwk9527

出处:https://www.cnblogs.com/lwk9527/p/17374704.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   流纹  阅读(380)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
more_horiz
keyboard_arrow_up light_mode palette
选择主题
点击右上角即可分享
微信分享提示