Question

Je recherche un accès 2007 équivalent à la fonction COALESCE de SQL Server.

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 souhaite faire de même, mais dans Access 2007.

Quelqu'un sait-il comment combiner de telles lignes dans Access 2007?

Était-ce utile?

La solution

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 de 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

Autres conseils

Je pense que Nz est ce que vous recherchez, la syntaxe est Nz (variant, [si valeur nulle]) . Voici le lien vers la documentation: Fonction Nz

---Person--- 
John
Steve
Richard

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

PRINT @PersonList

Bien que Nz fasse une chose comparable à COALESCE, vous ne pouvez pas l'utiliser dans Access pour effectuer l'opération que vous effectuez. Ce n'est pas la COALESCE qui construit la liste des valeurs de ligne, mais 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’existe aucune possibilité de déclarer une variable.

Je pense que vous auriez besoin de créer une fonction permettant d'ouvrir un jeu de résultats, de l'itérer dessus et de concaténer les valeurs de ligne dans une chaîne.

Pour combiner des lignes dans Access, vous aurez probablement besoin d'un code ressemblant à 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 voudrez ajouter un code de traitement des erreurs et nettoyer votre jeu d'enregistrements. Cela changera légèrement si vous utilisez ADO au lieu de DAO, mais l'idée générale est la même.

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.

In " standard " Access (jeu d'enregistrements DAO), vous devrez ouvrir un jeu d'enregistrements et utiliser la méthode getrows pour que vos données soient

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 (ce sera bidimensionnel), vous pouvez le manipuler pour extraire la " colonne " tu auras besoin. Il existe peut-être un moyen astucieux d’en extraire un tableau à une dimension. Vous pouvez alors utiliser la commande " Joindre " instruction pour concaténer chaque valeur de tableau dans une chaîne.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top