ms-access中是否有一个group_concat函数?

ms-access中是否有一个group_concat函数?

你应该问自己,如果你需要一个通用的解决scheme( 另一个是由艾伦·布朗 ),或者如果你只是为了目前的需要。 如果你真的只需要这一次,简单的方法就可以了。

在附注中,当连接VBA代码中的列表时,利用长期访问大师Trevor Best教给我的一个技巧,那就是在每个值的开始处粘贴分隔符,然后使用Mid()去除它closures。 而不是通过子logging循环:

If Len(strOutput) = 0 Then strOutput = NewValue Else strOutput = strOutput & ", " & NewValue End If 

…在循环中使用这个:

  strOutput = strOutput & ", " & NewValue 

…然后当您退出循环时,请删除前导分隔符:

  strOutput = Mid(strOutput, 3) 

这在整个地方都有影响,并且简化了在大量上下文中连接的代码。

Duane Hookum(微软MVP)发现了这篇文章 ,声称能够做你想做的事情。 我还没有testing过。


顺便说一句,如果你有兴趣,这是我的发现:

首先search: group_concat访问带领我这个post与这个答案,但链接被打破 。

然后我search了答案试图链接到的内容后,发现它: site:http://www.rogersaccesslibrary.com/ concatenate 。

有一个访问函数将多个值分组到一个值(我猜是自定义聚合)。链接是http://www.rogersaccesslibrary.com/Otherdownload.asp?SampleName='Generic%20Function%20To%20Concatenate%20Child% 20条

但现在这个网站已经closures了。 如果你google的href,你会发现很多引用和例子。

编号访问没有GROUP_CONCATfunction。 但是,可以创build一个VBA函数,它可以让你传递一个包含SQL语句的string,并获得相应的function(不是我推荐它,但它是可能的)。

以我自己的个人回台机器,这是恐龙统治地球时我写回的一些代码:

 Public Function ListQuery(SQL As String _ , Optional ColumnDelimiter As String = " " _ , Optional RowDelimter As String = vbCrLf) As String 'PURPOSE: to return a combined string from the passed query 'ARGS: ' 1. SQL is a valid Select statement ' 2. ColumnDelimiter is the character(s) that separate each column ' 3. RowDelimiter is the character(s) that separate each row 'RETURN VAL: 'DESIGN NOTES: Const PROCNAME = "ListQuery" Const MAXROWS = 100 Const MAXCOLS = 10 Dim oConn As ADODB.Connection Dim oRS As ADODB.Recordset Dim oField As ADODB.Field Dim sRow As cString Dim sResult As cString On Error GoTo ProcErr Set sResult = New cString Set sRow = New cString Set oConn = GetADOConn() sResult.Clear Do Until oRS.EOF sRow.Clear For Each oField In oRS.Fields With sRow If .Length > 0 Then .Append ColumnDelimiter End If .Append Nz(oField.Value) End With Next oField sRow.Trim If sRow.Length > 0 Then With sResult .Append sRow .Append RowDelimter End With End If oRS.MoveNext Loop oRS.Close oConn.Close With sResult If .Right(Len(RowDelimter)).Value = RowDelimter Then .Length = .Length - Len(RowDelimter) End If End With FunctionResult: ListQuery = sResult.Value CleanUp: Set sResult = Nothing Set sRow = Nothing Set oField = Nothing Set oRS = Nothing Set oConn = Nothing Exit Function ProcErr: ' logging code... Resume CleanUp End Function 

GetADOConn函数是一个集中的函数来检索当前的数据库连接。 cString是一个模仿.NET的StringBuilder类的行为的类,但是早在.NET被TLD和市场宣传之外的东西之前编写了。 由于每行都被调用,所以VBA的内置string连接将会很慢,因此需要类似于StringBuilder类的东西。 原来的代码(我已经部分修改)对可以使用的行数和列数有一个上限,这就是常量所关心的。

Interesting Posts