提问人:NakedBrunch 提问时间:9/18/2008 最后编辑:braXNakedBrunch 更新时间:7/11/2020 访问量:16398
合并行/连接行
Combine rows / concatenate rows
问:
我正在寻找与 SQL Server 的 COALESCE 函数等效的 Access 2007。
在 SQL Server 中,可以执行如下操作:
人
John
Steve
Richard
SQL格式
DECLARE @PersonList nvarchar(1024)
SELECT @PersonList = COALESCE(@PersonList + ',','') + Person
FROM PersonTable
PRINT @PersonList
产生:约翰、史蒂夫、理查德
我想在 Access 2007 中做同样的事情。
有谁知道如何在Access 2007中合并这样的行?
答:
我认为 Nz 是你所追求的,语法是.以下是文档链接: Nz 函数Nz(variant, [if null value])
---Person---
John
Steve
Richard
DECLARE @PersonList nvarchar(1024)
SELECT @PersonList = Nz(@PersonList + ',','') + Person
FROM PersonTable
PRINT @PersonList
尽管 Nz 的功能与 COALESCE 相当,但您不能在 Access 中使用它来执行您正在执行的操作。不是 COALESCE 在构建行值列表,而是将连接到变量中。
不幸的是,这在 Access 查询中是不可能的,因为 Access 查询必须是单个 SQL 语句,并且没有声明变量的工具。
我认为您需要创建一个函数来打开结果集,遍历它并将行值连接成一个字符串。
若要在 Access 中合并行,可能需要如下所示的代码:
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,这将略有变化,但总体思路是相同的。
我在这里了解到您有一个包含 3 条记录的表“人”。没有什么可以与您在 Access 中描述的内容相提并论。
在“标准”访问(DAO 记录集)中,您必须打开一个记录集并使用 getrows 方法来获取数据
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”指令将每个数组值连接在一个字符串中。
评论
下面是一个示例用户定义函数 (UDF) 和可能的用法。
功能:
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
用法:
SELECT documents.MembersOnly,
Coalsce("SELECT FName From Persons WHERE Member=True",":") AS Who,
Coalsce("",":","Mary","Joe","Pat?") AS Others
FROM documents;
ADO 版本,灵感来自 onedaywhen 的评论
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
评论