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 :(
首先,您需要将该字符串拆分.这是一个可行的分割功能:
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)