Pergunta

Eu estou procurando um Access 2007 equivalente a função COALESCE do SQL Server.

No SQL Server que você poderia fazer algo como:

Person

John
Steve
Richard

SQL

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

PRINT @PersonList

Que produz: John, Steve, Richard

Eu quero fazer o mesmo, mas em Access 2007.

Alguém sabe como combinar linhas como este no Access 2007?

Foi útil?

Solução

Aqui está um exemplo Função Definida pelo Usuário (UDF) e possível uso.

Função:

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

Uso:

SELECT documents.MembersOnly, 
    Coalsce("SELECT FName From Persons WHERE Member=True",":") AS Who, 
    Coalsce("",":","Mary","Joe","Pat?") AS Others
FROM documents;
versão

Um ADO, inspirado por um comentário por 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

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

Outras dicas

Eu acho Nz é o que você está depois, a sintaxe é Nz(variant, [if null value]). Aqui está o link documentação: Nz Function

---Person--- 
John
Steve
Richard

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

PRINT @PersonList

Embora Nz faz uma coisa comparável ao COALESCE, você não pode usá-lo no Access para fazer a operação que está executando. Não é o COALESCE que está a construir a lista de valores de linha, é o concatenatiion em uma variável.

Infelizmente, isso não é possível dentro de uma consulta do Access que tem de ser uma única instrução SQL e onde não existe a possibilidade de declarar uma variável.

Eu acho que você precisa para criar uma função que iria abrir um conjunto de resultados, iterate sobre ele e concatenar os valores de linha em uma string.

Para combinar linhas no Access, você provavelmente vai precisar de código que é algo como isto:

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

Você vai querer adicionar o código de tratamento de erros e limpar seu conjunto de registros, e isso vai mudar um pouco, se você usar ADO em vez de DAO, mas a idéia geral é a mesma.

Eu entendo aqui que você tem uma "pessoa" mesa com 3 registros. Não há nada comparável ao que você descreve no Access.

Em "padrão" Access (DAO registros), você terá que abrir um conjunto de registros e usar os GetRows método para ter seus dados

Dim rs as DAO.recordset, _
    personList as String, _
    personArray() as variant

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

rs.close

Uma vez que você tem essa matriz (que será bidimensional), você pode manipulá-lo para extrair a "coluna" você vai precisar. Pode haver uma maneira inteligente para extrair uma matriz unidimensional de isso, então você pode usar o "Join" instrução para concatenar cada valor de matriz em uma string.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top