我有一张带有电话号码的表格。我没有为每个号码吐出一行,而是返回逗号分隔的电话号码列表。在sql中最简单的方法是什么?一个循环?
答案 0 :(得分:9)
其中一些答案因合并和更复杂的XML查询而过于复杂。我一直都在用这个:
select @Phones=(
Select PhoneColumn+','
From TableName
For XML Path(''))
-- Remove trailing comma if necessary
select @Phones=left(@Phones,len(@Phones)-1)
答案 1 :(得分:3)
您可以创建一个可以执行此类操作的UDF
CREATE FUNCTION dbo.GetBirthdays(@UserId INT)
RETURNS VARCHAR(MAX)
AS
BEGIN
DECLARE @combined VARCHAR(MAX)
SELECT @combined = COALESCE(@combined + ', ' + colName + ', colName)
FROM YourTable
WHERE UserId = @UserId
ORDER BY ColName
END
基本上,这只是将所有值都拉到一个简单的列表中。
答案 2 :(得分:1)
请参阅此question的答案。在该问题中还列出了其他几种方法。 COALESCE或xml路径应该可以解决这个问题。
修改(在上一个问题中添加了我的答案):
CREATE FUNCTION [dbo].[fn_MyFunction]()RETURNS NVARCHAR(MAX)
AS
BEGIN
DECLARE @str NVARCHAR(MAX)
DECLARE @Delimiter CHAR(2)
SET @Delimiter = ', '
SELECT @str = COALESCE(@str + @Delimiter,'') + AColumn
FROM dbo.myTable
RETURN RTRIM(LTRIM(@str))
END
答案 3 :(得分:1)
FWIW我创建了一个SQL CLR Aggregate函数。像冠军一样工作!
[序列化] [SqlUserDefinedAggregate(Format.UserDefined, Name =“JoinStrings”, IsInvariantToNulls = TRUE, IsInvariantToDuplicates =假, IsInvariantToOrder =假, MaxByteSize = 8000)]公共结构 JoinStrings:IBinarySerialize { public string Result;
public void Init() { Result = ""; } public void Accumulate(SqlString value) { if (value.IsNull) return; Result += value.Value + ","; } public void Merge(JoinStrings Group) { Result += Group.Result; } public SqlString Terminate() { return new SqlString(Result.ToString().Trim(new
char [] {','})); }
public void Read(System.IO.BinaryReader r) { Result = r.ReadString(); } public void Write(System.IO.BinaryWriter w) { w.Write(Result.ToString()); } }
然后我可以这样使用它:
SELECT dbo.JoinStrings(Phone) FROM Phones Where UserID = XXX
答案 4 :(得分:1)
假设您有一个具有唯一ID的Customers表和另一个名为PhoneNumbers的表,其中每个客户将客户ID字段作为外键共享多个电话号码,这将使用相关的子查询
Select C.ID, C.FirstName, C.LastName,
(select (STUFF(( SELECT ', ' + PhoneNumber from PhoneNumbers P where P.CID = C.ID
FOR XML PATH('')), 1, 2, ''))) as PhoneNumbers
from Customers C
答案 5 :(得分:0)
This question有几个不错的选择。我实际上已经提到了同样的问题,并实施了一个或多个回复。
Here是另一套好的选择。
答案 6 :(得分:0)
Select Unique ID, Replace(Rtrim(Ltrim(Case when [Phone_Number1] is not null Then [Phone_Number1]+' ' Else '' End +
Case when [Phone_Number2] is not null Then [Phone_Number2]+' ' Else '' End +
Case when [Phone_Number3] is not null Then [Phone_Number3]+' ' Else '' End)),' ',', ') as Phone_numbers
From MYTable
希望这是你正在寻找的东西,我不知道在这个问题之后这对你是否会有所帮助。