关于vba:合并行/串联行

关于vba:合并行/串联行

Combine rows / concatenate rows

我正在寻找与SQL Server的COALESCE函数等效的Access 2007。

在SQL Server中,您可以执行以下操作:

1
2
3
John
Steve
Richard

的SQL

1
2
3
4
5
DECLARE @PersonList nvarchar(1024)
SELECT @PersonList = COALESCE(@PersonList + ',','') + Person
FROM PersonTable

PRINT @PersonList

产生:约翰,史蒂夫,理查德

我想在Access 2007中做同样的事情。

有谁知道如何在Access 2007中合并这样的行?


这是示例用户定义功能(UDF)及其可能的用法。

功能:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Function Coalsce(strSQL As String, strDelim, ParamArray NameList() As Variant)
Dim db As Database
Dim rs As DAO.Recordset
Dim strList As String

    Set db = CurrentDb

    If strSQL <>"" Then
        Set rs = db.OpenRecordset(strSQL)

        Do While Not rs.EOF
            strList = strList & strDelim & rs.Fields(0)
            rs.MoveNext
        Loop

        strList = Mid(strList, Len(strDelim))
    Else

        strList = Join(NameList, strDelim)
    End If

    Coalsce = strList

End Function

用法:

1
2
3
4
SELECT documents.MembersOnly,
    Coalsce("SELECT FName From Persons WHERE Member=True",":") AS Who,
    Coalsce("",":","Mary","Joe","Pat?") AS Others
FROM documents;

ADO版本,灵感来自onedaywhen的评论

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Function ConcatADO(strSQL As String, strColDelim, strRowDelim, ParamArray NameList() As Variant)
   Dim rs As New ADODB.Recordset
   Dim strList As String

   On Error GoTo Proc_Err

       If strSQL <>"" Then
           rs.Open strSQL, CurrentProject.Connection
           strList = rs.GetString(, , strColDelim, strRowDelim)
           strList = Mid(strList, 1, Len(strList) - Len(strRowDelim))
       Else
           strList = Join(NameList, strColDelim)
       End If

       ConcatADO = strList

   Exit Function

   Proc_Err:
       ConcatADO ="***" & UCase(Err.Description)
   End Function

来自:http://wiki.lessthandot.com/index.php/Concatenate_a_List_into_a_Single_Field_%28Column%29


我在这里了解到您有一个表" person",其中包含3条记录。没有什么可与您在Access中描述的内容相提并论。

在"标准"访问(DAO记录集)中,您将必须打开一个记录集并使用getrows方法获取数据

1
2
3
4
5
6
7
8
Dim rs as DAO.recordset, _
    personList as String, _
    personArray() as variant

set rs = currentDb.open("Person")
set personArray = rs.getRows(rs.recordcount)

rs.close

一旦有了这个数组(它将是二维的),就可以对其进行操作以提取所需的"列"。可能有一种聪明的方法可以从中提取一维数组,因此您可以使用" Join"指令将每个数组值连接到一个字符串中。


要在Access中合并行,您可能需要看起来像这样的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Public Function Coalesce(pstrTableName As String, pstrFieldName As String)

Dim rst As DAO.Recordset
Dim str As String

    Set rst = CurrentDb.OpenRecordset(pstrTableName)
    Do While rst.EOF = False
        If Len(str) = 0 Then
            str = rst(pstrFieldName)
        Else
            str = str &"," & rst(pstrFieldName)
        End If
        rst.MoveNext
    Loop

    Coalesce = str

End Function

您将需要添加错误处理代码并清理您的记录集,如果您使用ADO而不是DAO,这会稍有改变,但是总体思路是相同的。


尽管Nz可以与COALESCE相比,但是您不能在Access中使用它来执行您要执行的操作。构建行值列表的不是COALESCE,而是连接到变量中。

不幸的是,在必须具有单个SQL语句且没有声明变量的工具的Access查询中,这是不可能的。

我认为您需要创建一个函数,该函数将打开结果集,对其进行迭代,然后将行值连接为字符串。


我认为Nz是您的追求,语法是Nz(variant, [if null value])。这是文档链接:Nz函数

1
2
3
4
5
6
7
8
9
10
---Person---
John
Steve
Richard

DECLARE @PersonList nvarchar(1024)
SELECT @PersonList = Nz(@PersonList + ',','') + Person
FROM PersonTable

PRINT @PersonList


推荐阅读

    linux操作命令网络?

    linux操作命令网络?,网络,工作,工具,系统,地址,状态,信息,命令,目录,服务,lin

    linux操作数据库命令?

    linux操作数据库命令?,地址,服务,系统,密码,数据库,工具,名字,首页,命令,参

    linux系命令的操作?

    linux系命令的操作?,工作,系统,信息,网络,命令,基础,简介,管理,目录,操作,lin

    linux执行多次命令?

    linux执行多次命令?,系统,信息,标准,工作,情况,命令,周期性,服务,代码,时间,l

    linux显示操作命令?

    linux显示操作命令?,系统,工作,地址,信息,管理,命令,目录,基础,工具,标准,lin

    linux并行化执行命令?

    linux并行化执行命令?,系统,工具,信息,命令,名称,网络,管理,首页,服务,暂停,L

    如何执行linux命令?

    如何执行linux命令?,单位,系统,网络,信息,权威,命令,文件,音乐,目录,选项,mv

    linux合并行命令行?

    linux合并行命令行?,工作,系统,地址,信息,文件,代码,目录,命令,功能,内容,Lin

    linux打断执行的命令?

    linux打断执行的命令?,系统,状态,网站,标准,通用,客服,人员,名字,网络,暂停,L

    linux操作常用命令?

    linux操作常用命令?,工作,系统,地址,信息,命令,目录,管理,标准,基础,工具,lin

    linux命令没执行完?

    linux命令没执行完?,系统,设备,工具,情况,密码,状态,电脑,管理,材料,服务,Lin

    linux操作命令重命名?

    linux操作命令重命名?,图片,软件,名称,名字,文件,命令,状态,代码,工具,系统,L

    shell中执行linux命令?

    shell中执行linux命令?,系统,名称,环境,管理,工作,代码,技术,软件,经理,基础

    linux打印命令执行?

    linux打印命令执行?,信息,系统,工具,服务,命令,发行,基础,位置,设备,时间,怎

    linux执行两次命令?

    linux执行两次命令?,系统,信息,连续,名称,命令,初级,首页,工具,管理,终端,lin

    linux命令执行安装?

    linux命令执行安装?,软件,系统,管理,网站,官网,市场,中心,最新,灵活,工作,如

    linux执行一条新命令?

    linux执行一条新命令?,系统,工作,命令,管理,网络,服务,信息,目录,路径,脚本,L

    linux目录操作命令d?

    linux目录操作命令d?,工作,系统,信息,命令,情况,基础,数据,名称,地址,目录,li

    监控linux执行命令?

    监控linux执行命令?,系统,情况,数据,实时,网络,信息,状态,时间,设备,命令,如

    linux初学者操作命令?

    linux初学者操作命令?,工作,系统,信息,命令,网络,地址,单位,位置,管理,数据,L