Combina righe/concatena righe
-
01-07-2019 - |
Domanda
Sto cercando un equivalente di Access 2007 alla funzione COALESCE di SQL Server.
In SQL Server potresti fare qualcosa del tipo:
Persona
John
Steve
Richard
SQL
DECLARE @PersonList nvarchar(1024)
SELECT @PersonList = COALESCE(@PersonList + ',','') + Person
FROM PersonTable
PRINT @PersonList
Che produce:Giovanni, Steve, Riccardo
Voglio fare lo stesso ma in Access 2007.
Qualcuno sa come combinare righe come questa in Access 2007?
Soluzione
Di seguito è riportato un esempio di funzione definita dall'utente (UDF) e il possibile utilizzo.
Funzione:
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
Utilizzo:
SELECT documents.MembersOnly,
Coalsce("SELECT FName From Persons WHERE Member=True",":") AS Who,
Coalsce("",":","Mary","Joe","Pat?") AS Others
FROM documents;
Una versione ADO, ispirata da un commento di 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
Da: http://wiki.lessthandot.com/index.php/Concatenate_a_List_into_a_Single_Field_%28Column%29
Altri suggerimenti
Penso che Nz sia quello che cerchi, la sintassi lo è Nz(variant, [if null value])
.Ecco il link alla documentazione: Funzione NZ
---Person---
John
Steve
Richard
DECLARE @PersonList nvarchar(1024)
SELECT @PersonList = Nz(@PersonList + ',','') + Person
FROM PersonTable
PRINT @PersonList
Sebbene Nz faccia una cosa paragonabile a COALESCE, non puoi usarlo in Access per eseguire l'operazione che stai eseguendo.Non è COALESCE a costruire l'elenco dei valori delle righe, è la concatenazione in una variabile.
Sfortunatamente, questo non è possibile all'interno di una query di Access che deve essere una singola istruzione SQL e dove non è possibile dichiarare una variabile.
Penso che dovresti creare una funzione che apra un set di risultati, esegua un'iterazione su di esso e concateni i valori delle righe in una stringa.
Per combinare le righe in Access, probabilmente avrai bisogno di un codice simile al seguente:
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
Ti consigliamo di aggiungere codice di gestione degli errori e ripulire il tuo recordset, e questo cambierà leggermente se usi ADO invece di DAO, ma l'idea generale è la stessa.
Capisco qui che hai una tabella "persona" con 3 record.Non c'è nulla di paragonabile a ciò che descrivi in Access.
Nell'accesso "standard" (recordset DAO), dovrai aprire un recordset e utilizzare il metodo getrows per avere i tuoi dati
Dim rs as DAO.recordset, _
personList as String, _
personArray() as variant
set rs = currentDb.open("Person")
set personArray = rs.getRows(rs.recordcount)
rs.close
una volta che hai questo array (sarà bidimensionale), puoi manipolarlo per estrarre la "colonna" di cui avrai bisogno.Potrebbe esserci un modo intelligente per estrarre un array unidimensionale da questo, quindi puoi utilizzare l'istruzione "Join" per concatenare ciascun valore dell'array in una stringa.