Frage

Ich bin auf der Suche nach einem Access 2007 entspricht SQL Server COALESCE-Funktion.

In SQL Server Sie etwas tun könnten, 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 tun, aber in Access 2007.

Wer weiß, wie Zeilen zu kombinieren, wie dies in Access 2007?

War es hilfreich?

Lösung

Hier ist ein Beispiel User Defined Function (UDF) und mögliche Nutzung.

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, inspiriert durch einen Kommentar 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

Andere Tipps

Ich denke, Nz ist, was Sie nach, Syntax ist Nz(variant, [if null value]). Hier ist die Dokumentation Link: Nz-Funktion

---Person--- 
John
Steve
Richard

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

PRINT @PersonList

Obwohl Nz eine vergleichbare Sache tut koaleszieren, können Sie es nicht in Access verwenden, um den Vorgang zu tun, die Sie durchführen. Es ist nicht die COALESCE, die die Liste der Zeilenwerte bauen, dann ist es die concatenatiion in eine Variable.

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

Ich glaube, Sie müssen eine Funktion erstellen, die eine resultset öffnen würden, über sie durchlaufen und die Zeilenwerte in eine String verketten.

So kombinieren Zeilen in Access, haben 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 Fehlerbehandlungscode hinzufügen und Ihre Cord-aufzuräumen, und dies wird leicht ändern, wenn Sie ADO anstelle von DAO, aber die allgemeine Idee ist die gleiche.

Ich verstehe, dass Sie hier mit 3 Datensätze eine Tabelle „Person“ haben. Es gibt nichts Vergleichbares zu dem, was Sie in Access beschreiben.

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

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

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

rs.close

, wenn Sie dieses Array haben (es wird bidimensional sein), können Sie es manipulieren kann die „Spalte“ zu extrahieren, die Sie benötigen. Es könnte eine intelligente Art und Weise sein, ein eindimensionales Array aus diesem zu extrahieren, so dass Sie kann dann die „Join“ Anweisung an jeden Array-Wert in einer Zeichenfolge verketten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top