SQL为一组id选择连接字符串

Big*_*Dog 0 sql sql-server select join

我必须处理一个mssql数据库和表中给出的信息,如下所示:

Users:

ID Name    Countries
--------------------
1  User1   1,2,3
2  User2   2,5

Countries:
ID Country
----------
1  Australia
2  Germany
3  USA
4  Norway
5  Canada
Run Code Online (Sandbox Code Playgroud)

现在,我正在寻找的是一个select语句,它将给我一个这样的结果:

Result:
ID User   CountriesByName
-----------------------------
1  User1  Australia, Germany, USA
2  User2  Germany, Canada
Run Code Online (Sandbox Code Playgroud)

我更喜欢一种解决方案,它不依赖于特殊的MSSQL语法,但我无法使用一些LINQ-magic :(

Chr*_*sen 6

首先,您需要将该字符串拆分.这是一个可行的分割功能:

Create Function [dbo].[split]
    (@input   varChar(8000)        -- List of delimited items
    ,@delimit varChar(8000) = ',') -- delimiter that separates items
Returns @List Table ([item] varChar(8000)) As
Begin

Declare @item VarChar(8000);

while charIndex(@delimit, @input, 0) <> 0 Begin

    Select
        @item  = rTrim(lTrim(subString(@input, 1, charIndex(@delimit, @input, 0) - 1))),
        @input = rTrim(lTrim(subString(@input, charIndex(@delimit, @input, 0) + Len(@delimit), Len(@input))));

    If Len(@item) > 0 Insert Into @List Select @item

End

If Len(@input) > 0 Insert Into @List Select @input

Return;

End
Run Code Online (Sandbox Code Playgroud)

然后,您需要将值加入到您的国家/地区表中,然后重新加入它们.这将帮助您完成大部分工作:

Select ID
      ,[Name] as [User]
      ,(
        Select [country] + ', '
        From [Countries]
        Where [ID] In (
            Select Cast([item] As Integer)
            From dbo.split(U.Countries, ',')
            Where IsNumeric(item) = 1)
        Order By [country]
        For XML Path('')) As [CountriesByName]
From [Users] As U
Run Code Online (Sandbox Code Playgroud)

但是,这留下了一个逗号.您可能希望在其他某个层上删除它,但为了防止您必须在SQL中执行此操作,这应该可以:

Select ID
      ,[User]
      ,Left([CountriesByName], Len([CountriesByName]) - 1) As [CountriesByName]
From (
    Select ID
          ,[Name] as [User]
          ,(
            Select [country] + ', '
            From [Countries]
            Where [ID] In (
                Select Cast([item] As Integer)
                From dbo.split(U.Countries, ',')
                Where IsNumeric(item) = 1)
            Order By [country]
            For XML Path('')) As [CountriesByName]
    From [Users] As U) As [Results]
Run Code Online (Sandbox Code Playgroud)