2008-09-18 39 views
8

Tôi đang tìm một Access 2007 tương đương với hàm COALESCE của SQL Server.Kết hợp các hàng/nối các hàng

Trong SQL Server bạn có thể làm một cái gì đó như:

Person

John 
Steve 
Richard 

SQL

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

PRINT @PersonList 

nào sản xuất: John, Steve, Richard

Tôi muốn làm tương tự nhưng trong Access 2007.

Có ai biết cách kết hợp các hàng như thế này trong Access 2007 không?

Trả lời

13

Dưới đây là một mẫu do người dùng định nghĩa chức năng (UDF) và sử dụng có thể.

Chức năng:

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 

Cách sử dụng:

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

Một ADO, lấy cảm hứng từ một lời nhận xét của 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 

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

+0

Tôi đã tìm kiếm giải pháp cho vấn đề này quá lâu - cảm ơn! Chỉnh sửa nhỏ - dấu tách hàng đầu không bị tước khỏi danh sách chính xác: strList = Giữa (strList, Len (strDelim) +1) – JeffP

0

Tôi nghĩ rằng Nz là những gì bạn đang làm sau, cú pháp là Nz(variant, [if null value]). Đây là liên kết tài liệu: Nz Function

---Person--- 
John 
Steve 
Richard 

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

PRINT @PersonList 
0

Mặc dù Nz làm một điều tương đương với COLALESCE, bạn có thể không sử dụng nó trong Access để làm các hoạt động bạn đang thực hiện. Nó không phải là COALESCE đang xây dựng danh sách các giá trị hàng, đó là sự kết hợp thành một biến.

Thật không may, điều này không thể xảy ra bên trong truy vấn truy nhập phải là một câu lệnh SQL duy nhất và không có cơ sở để khai báo biến.

Tôi nghĩ bạn sẽ cần phải tạo một hàm sẽ mở một resultset, lặp qua nó và nối các giá trị hàng vào một chuỗi.

0

Để kết hợp các hàng trong Access, có thể bạn sẽ cần mã mà trông giống như sau:

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 

Bạn sẽ muốn thêm mã lỗi xử lý và dọn dẹp recordset của bạn, và điều này sẽ thay đổi một chút nếu bạn sử dụng ADO thay vì DAO, nhưng ý tưởng chung là như nhau.

0

Tôi hiểu ở đây bạn có bảng "người" với 3 bản ghi. Không có gì so sánh với những gì bạn mô tả trong Access.

Trong Access "chuẩn" (DAO recordset), bạn sẽ phải mở một recordset và sử dụng getrows phương pháp để có dữ liệu của bạn

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

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

rs.close 

một khi bạn có mảng này (nó sẽ được hai chiều), bạn có thể thao tác nó để trích xuất "cột" bạn sẽ cần. Có thể có một cách thông minh để trích xuất một mảng một chiều từ điều này, vì vậy bạn có thể sử dụng lệnh "Tham gia" để ghép nối từng giá trị mảng trong một chuỗi.

+0

NGƯỜI là tên trường trong t ví dụ trong khi bảng là PersonTable. –

Các vấn đề liên quan