Kombinieren Sie Zeilen / verketten Reihen
-
01-07-2019 - |
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?
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.