代码之家  ›  专栏  ›  技术社区  ›  Samra

逗号分隔列上的sql联接

  •  0
  • Samra  · 技术社区  · 6 年前

    应该很简单

    TABLE1
    AccreditationStatus         FacilityId      FacilityName                GroupAlphabet   NodeName    c_NodeId
            -------------------------------------------------------------------------------------------------------------
            Current                     12359116         Addiction Medicine         A               Nepean      4
    
    
    TABLE2
            NodeId                      GroupNames      RegPerSup   FacCapacility
            ------------------------------------------------------------------------
            4                           A,B,X           1           2
    

    我的问题

    select *
    from table1 left join
         table2 ast
         on ast.nodeid = c_NodeId and
         GroupAlphabet in (select items from SplitString(ast.GroupNames, ','))
    

    Current                     12359116         Addiction Medicine         A               Nepean      4     NULL    NULL    NULL NULL
    

    如果我试着

    select *
    from table1 left join
         table2 ast
         on ast.nodeid = c_NodeId and
            GroupAlphabet like '%' + ast.GroupNames + '%'
    

    结果只对精确匹配而不是逗号分隔的组是正确的

    SplitString是一个UDF,它返回一个数据类型为nvarchar的表(如果重要的话,GroupAlphabet是varchar类型)

    ALTER FUNCTION [dbo].[SplitString](@String NVARCHAR(max), @Delimiter char(1))    
    returns @temptable TABLE (items NVARCHAR(max))       
    as      
    begin  
          declare @idx int   
         declare @slice NVARCHAR(max)         
    select @idx = 1     
           if len(@String)<1 or @String is null  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
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   JERRY    6 年前

    Gordon Linoff适合行级数据存储,而不是逗号分隔。 如果您使用了逗号分隔的数据,并且表的大小很高,那么我还有一个针对MS SQL Server的具有良好查询性能的解决方案。

    将数据逗号分隔成列表,然后对所需的表使用JOIN。

     SELECT A.OtherID,  
         Split.a.value('.', 'VARCHAR(100)') AS Data  
     FROM  
     (
         SELECT OtherID,  
             CAST ('<M>' + REPLACE(Data, ',', '</M><M>') + '</M>' AS XML) AS Data  
         FROM  Table1
     ) AS A CROSS APPLY Data.nodes ('/M') AS Split(a); 
    
        2
  •  3
  •   Gordon Linoff    6 年前

    正确的格式使用 like 是:

    select *
    from table1 left join
         table2 ast
         on ast.nodeid = c_NodeId and
            ',' + ast.GroupNames + ',' like '%,' + table1.GroupAlphabet + ',%';
    

    我不知道你的第一个问题是什么。但是,应该使用连接表,而不是将事物列表存储在分隔字符串中。SQL有一个很好的存储列表的数据结构。它被称为 ,不是 一串