在 SQL 中创建连接函数

Posted

技术标签:

【中文标题】在 SQL 中创建连接函数【英文标题】:Create a concatenation function in SQL 【发布时间】:2010-08-20 20:17:23 【问题描述】:

假设我有一个包含一列 b 和三行 (1,2,3) 的表 a,我想创建一个返回 '1,2,3' 的函数,它的调用方式如下:SELECT FUNC (f), ... 来自 ...

换句话说,我有一个链接表,其中有多个行链接到第一个表的每一行,并且希望连接第二个表中一列的内容。在这种情况下,它是与特定观察相关联的名称列表。

我正在考虑为此使用 SQL 函数,但我不记得如何... :(

谢谢

【问题讨论】:

对不起,这是 SQL Server 2005。 【参考方案1】:

以下是 SQL Server 的示例:

CREATE FUNCTION ConcatenateMyTableValues
(@ID int)
RETURNS varchar(max)
AS
BEGIN
    declare @s as varchar(max);
    select @s = isnull(@s + ',', '') + MyColumn from MyTable where ID = @ID;
    return @s
end

然后你可以这样使用它:

select t.ID, t.Name, dbo.ConcatenateMyTableValues(t.ID)
from SomeTable t

【讨论】:

这真的会在@S 中返回多个值吗? @David:是的,它会将所有 MyColumn 值连接在一起,形成一个逗号分隔的字符串。如果你提供你的查询和架构,我可以给你更精确的代码。 甜,我确实找到了另一种方法,但这仍然是一个很好的答案。 :) @David:我建议你使用我的方法而不是游标方法,因为它已经足够慢了,而且不会增加游标的开销。【参考方案2】:

您可以使用 COALESCE 将一列中的值转换为 csv

http://www.sqlteam.com/article/using-coalesce-to-build-comma-delimited-string

我不确定您将如何创建函数 除非您不介意创建一个可以接受列名的动态 sql,然后在运行时相应地构建 sql。

编辑。 这仅适用于 SQL Server。 没想到你没有提到任何数据库。

【讨论】:

【参考方案3】:
DECLARE @list AS varchar(MAX)

SELECT @list = ISNULL(@list + ',', '') +  b
FROM MyTable

SELECT @list AS Result

这里有一种递归方式(ms sql)

【讨论】:

【参考方案4】:

取决于您的技术。

如果是Oracle,查看stragg函数。http://www.sqlsnippets.com/en/topic-11591.html

如果是 MSSQL,请使用 XML PATH 技巧http://sqlblogcasts.com/blogs/tonyrogerson/archive/2009/03/29/creating-an-output-csv-using-for-xml-and-multiple-rows.aspx

【讨论】:

mysql 有 group_concat(column) 哦,太好了,我不知道:D【参考方案5】:

我想我会回答我自己的问题,因为我实际上有一种使用 CURSOR 的方法(我的想法中缺少那个关键字..)

更改功能 [dbo].[GET_NOM_MEDECIN_REVISEURS] (@NoAs810 int) 返回 NVARCHAR(1000) 作为 开始 如果@NoAs810 = 0 返回 '​​' 别的 开始 声明 @NomsReviseurs NVARCHAR(1000) 将@IdReviseurs 声明为表(IdReviseur int) 声明 @TempNomReviseur NVARCHAR(50) SET @NomsReviseurs = '' 声明 CurReviseur CURSOR FOR SELECT DISTINCT Nom FROM T_Ref_Reviseur R INNER JOIN T_Signature S ON R.IdReviseur = S.idReviseur WHERE NoAs810 = @NoAs810 OPEN CurReviseur 从 CurReviseur 获取到 @TempNomReviseur 而@@FETCH_STATUS = 0 开始 设置 @NomsReviseurs = @NomsReviseurs + @TempNomReviseur 从 CurReviseur 获取下一个到 @TempNomReviseur 如果@@FETCH_STATUS = 0 SET @NomsReviseurs = @NomsReviseurs + ' - ' 结尾 关闭 CurReviseur 返回@NomsReviseurs 结尾 返回 '​​' 结尾

【讨论】:

以上是关于在 SQL 中创建连接函数的主要内容,如果未能解决你的问题,请参考以下文章

坚持在模型中创建连接 - Power BI

如何在 Qt SQLite 中创建多个连接?

在数据库中创建视图最多可以连接多少个表?连接表多了有啥影响…

从 Python Lambda 函数连接 Athena SQL 查询中的变量

如何使用多个 for 循环在 php 中创建 sql 语句

在 Python 中创建 NTFS 连接点