【问题标题】:Combine rows / concatenate rows合并行/连接行
【发布时间】:2010-09-10 16:46:08
【问题描述】:

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

【问题讨论】:

    标签: vba ms-access coalesce


    【解决方案1】:

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

    【讨论】:

    • 我一直在寻找这个问题的解决方案太久了 - 谢谢!小修正 - 前导分隔符未正确从列表中剥离:strList = Mid(strList, Len(strDelim)+1)
    【解决方案2】:

    我认为 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
    

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

          • PERSON 是示例中的字段名称,而表是 PersonTable。
          猜你喜欢
          • 2021-02-03
          • 1970-01-01
          • 2014-07-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-05-24
          • 2021-11-21
          • 1970-01-01
          相关资源
          最近更新 更多