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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top