多个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

最后获得结果就是我须要的结果

在这里插入图片描述