Combine linhas / linhas concatenar
-
01-07-2019 - |
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?
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.