8

我正在寻找与 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 中组合这样的行?

4

5 回答 5

14

这是一个示例用户定义函数 (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

于 2008-09-18T15:56:41.453 回答
0

我认为 Nz 是你所追求的,语法是Nz(variant, [if null value]). 这是文档链接:Nz Function

---Person--- 
John
Steve
Richard

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

PRINT @PersonList
于 2008-09-18T14:12:15.447 回答
0

尽管 Nz 做了与 COALESCE 类似的事情,但您不能在 Access 中使用它来执行您正在执行的操作。构建行值列表的不是 COALESCE,而是变量的连接。

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

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

于 2008-09-18T14:38:27.850 回答
0

要在 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,这将略有改变,但总体思路是相同的。

于 2008-09-18T14:58:57.580 回答
0

我在这里了解到您有一个包含 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”指令将每个数组值连接到一个字符串中。

于 2008-09-18T15:02:05.717 回答