8

SQL Server の COALESCE 関数に相当する Access 2007 を探しています。

SQL Server では、次のようなことができます。

John
Steve
Richard

SQL

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

PRINT @PersonList

プロデュース:ジョン、スティーブ、リチャード

同じことをしたいのですが、Access 2007で。

Access 2007 でこのような行を結合する方法を知っている人はいますか?

4

5 に答える 5

14

ユーザー定義関数 (UDF) のサンプルと使用方法を次に示します。

関数:

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

使用法:

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

onedaywhen のコメントに触発された ADO バージョン

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

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

于 2008-09-18T15:56:41.453 に答える
0

Access で行を結合するには、おそらく次のようなコードが必要になります。

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

エラー処理コードを追加して、レコードセットをクリーンアップする必要があります。これは、DAO の代わりに ADO を使用する場合は少し異なりますが、一般的な考え方は同じです。

于 2008-09-18T14:58:57.580 に答える
0

ここで、3 つのレコードを持つテーブル「person」があることを理解しています。あなたがAccessで説明したものに匹敵するものはありません。

「標準」アクセス (DAO レコードセット) では、レコードセットを開き、getrows メソッドを使用してデータを取得する必要があります。

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

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

rs.close

この配列を取得したら (二次元になります)、それを操作して必要な「列」を抽出できます。これから 1 次元配列を抽出するスマートな方法があるかもしれないので、「結合」命令を使用して、各配列値を 1 つの文字列に連結できます。

于 2008-09-18T15:02:05.717 に答える
0

Although Nz does a comparable thing to COALESCE, you can't use it in Access to do the operation you are performing. It's not the COALESCE that is building the list of row values, it's the concatenatiion into a variable.

Unfortunately, this isn't possible inside an Access query which has to be a single SQL statement and where there is no facility to declare a variable.

I think you would need to create a function that would open a resultset, iterate over it and concatenate the row values into a string.

于 2008-09-18T14:38:27.850 に答える
0

Nz はあなたが求めているものだと思います。構文はNz(variant, [if null value]). ドキュメント リンクは次のとおりです: Nz 関数

---Person--- 
John
Steve
Richard

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

PRINT @PersonList
于 2008-09-18T14:12:15.447 に答える