2008-09-18 6 views
8

Ich bin auf der Suche nach einer Access 2007-Entsprechung zu SQL Server COALESCE-Funktion.Zeilen kombinieren/Zeilen verketten

In SQL Server können Sie so etwas wie:

Person

John 
Steve 
Richard 

SQL

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

PRINT @PersonList 

Welche produziert: John, Steve, Richard

Ich möchte das gleiche aber in Access 2007 tun.

Kann jemand Zeilen wie diese in Access 2007 kombinieren?

Antwort

13

Hier ist eine Beispiel benutzerdefinierte Funktion (UDF) und mögliche Verwendung.

Funktion:

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 

Verbrauch:

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

Ein ADO-Version von einem Kommentar inspiriert von 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 

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

+0

Ich habe die Lösung für dieses Problem zu lange gesucht - danke! Kleine Korrektur - das führende Trennzeichen wird nicht korrekt von der Liste entfernt: strList = Mitte (strList, Len (strDelim) +1) – JeffP

0

Ich denke, Nz ist was du willst, Syntax ist Nz(variant, [if null value]). Hier ist die Dokumentation Link: Nz Function

---Person--- 
John 
Steve 
Richard 

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

PRINT @PersonList 
0

Obwohl Nz eine vergleichbare Sache tut koaleszieren, Sie es nicht in Access verwenden können, um den Betrieb zu tun Sie ausführen. Es ist nicht die COALESCE, die die Liste der Zeilenwerte erstellt, es ist die Verkettung zu einer Variablen.

Leider ist dies nicht möglich innerhalb einer Access-Abfrage, die eine einzelne SQL-Anweisung sein muss und wo es keine Möglichkeit gibt, eine Variable zu deklarieren.

Ich denke, Sie müssten eine Funktion erstellen, die eine Ergebnismenge öffnen, darüber iterieren und die Zeilenwerte in eine Zeichenfolge verketten würde.

0

Um Zeilen in Access zu kombinieren, werden Sie wahrscheinlich Code benötigen, die etwa wie folgt aussieht:

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 

Sie wollen werden Fehlerbehandlungscode und aufzuräumen Recordset hinzuzufügen, und dies wird leicht ändern wenn Sie ADO anstelle von DAO verwenden, aber die allgemeine Idee ist die gleiche.

0

Ich verstehe hier, dass Sie eine Tabelle "Person" mit 3 Datensätzen haben. Es gibt nichts vergleichbar mit dem, was Sie in Access beschreiben.

In „Standard“ Access (DAO-Cord), müssen Sie ein Re-Cord öffnen und die GetRows-Methode verwenden, um Ihre Daten

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

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

rs.close 

sobald Sie dieses Array haben (es wird bidimensional sein), Sie kann es manipulieren, um die "Spalte" zu extrahieren, die Sie benötigen. Es könnte eine schlaue Art sein, ein eindimensionales Array daraus zu extrahieren, so dass Sie dann die "Join" -Anweisung verwenden können, um jeden Array-Wert in einer Zeichenfolge zu verketten.

+0

PERSON ist der Feldname in t Das Beispiel, während die Tabelle PersonTable ist. –