2008-09-18 7 views
8

Je suis à la recherche d'un accès 2007 équivalent à la fonction COALESCE de SQL Server.Combiner des lignes/concaténer des lignes

Dans SQL Server, vous pouvez faire quelque chose comme:

Personne

John 
Steve 
Richard 

SQL

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

PRINT @PersonList 

qui produit: John, Steve, Richard

Je veux faire la même chose mais dans Access 2007.

Est-ce que quelqu'un sait comment combiner des lignes comme ça dans Access 2007?

Répondre

13

Voici un exemple de fonction définie par l'utilisateur (UDF) et d'utilisation possible.

Fonction:

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 

Utilisation:

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

Une version ADO, inspirée par un commentaire par 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 

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

+0

Je cherchais la solution à ce problème depuis trop longtemps - merci! Petite correction - le premier délimiteur n'est pas correctement retiré de la liste: strList = Mid (strList, Len (strDelim) +1) – JeffP

0

Je pense que Nz est ce que vous cherchez, la syntaxe est Nz(variant, [if null value]). Voici le lien de la documentation: Nz Function

---Person--- 
John 
Steve 
Richard 

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

PRINT @PersonList 
0

Bien que nz fait une chose comparable à COALESCE, vous ne pouvez pas l'utiliser dans Access pour effectuer l'opération que vous effectuez. Ce n'est pas COALESCE qui construit la liste des valeurs des lignes, c'est la concaténation en une variable. Malheureusement, cela n'est pas possible dans une requête Access qui doit être une seule instruction SQL et où il n'y a pas de possibilité de déclarer une variable.

Je pense que vous auriez besoin de créer une fonction qui ouvrirait un resultset, le parcourirait et concaténerait les valeurs de ligne dans une chaîne.

0

Pour combiner les lignes dans Access, vous aurez probablement besoin d'un code qui ressemble à ceci:

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 

Vous voulez ajouter du code de gestion des erreurs et nettoyer votre recordset, et cela va changer légèrement si vous utilisez ADO au lieu de DAO, mais l'idée générale est la même.

0

Je comprends ici que vous avez une table "personne" avec 3 enregistrements. Il n'y a rien de comparable à ce que vous décrivez dans Access.

Dans Access « standard » (DAO Recordset), vous devrez ouvrir un jeu d'enregistrements et utiliser la méthode GetRows pour vos données

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

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

rs.close 

une fois que vous avez ce tableau (il sera bidimensionnels), vous peut le manipuler pour extraire la "colonne" dont vous aurez besoin. Il pourrait y avoir une manière intelligente d'extraire un tableau à une dimension de ceci, ainsi vous pouvez utiliser l'instruction "Join" pour concaténer chaque valeur de tableau dans une chaîne.

+0

PERSONNE est le nom du champ en t Il exemple alors que la table est PersonTable. –

Questions connexes