我正在寻找与SQL Server的COALESCE函数等效的Access 2007。
在SQL Server中,您可以执行以下操作:
人
的SQL
1 2 3 4 5
| DECLARE @PersonList nvarchar(1024)
SELECT @PersonList = COALESCE(@PersonList + ',','') + Person
FROM PersonTable
PRINT @PersonList |
产生:约翰,史蒂夫,理查德
我想在Access 2007中做同样的事情。
有谁知道如何在Access 2007中合并这样的行?
这是示例用户定义功能(UDF)及其可能的用法。
功能:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| 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 |
用法:
1 2 3 4
| SELECT documents.MembersOnly,
Coalsce("SELECT FName From Persons WHERE Member=True",":") AS Who,
Coalsce("",":","Mary","Joe","Pat?") AS Others
FROM documents; |
ADO版本,灵感来自onedaywhen的评论
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| 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
我在这里了解到您有一个表" person",其中包含3条记录。没有什么可与您在Access中描述的内容相提并论。
在"标准"访问(DAO记录集)中,您将必须打开一个记录集并使用getrows方法获取数据
1 2 3 4 5 6 7 8
| Dim rs as DAO.recordset, _
personList as String, _
personArray() as variant
set rs = currentDb.open("Person")
set personArray = rs.getRows(rs.recordcount)
rs.close |
一旦有了这个数组(它将是二维的),就可以对其进行操作以提取所需的"列"。可能有一种聪明的方法可以从中提取一维数组,因此您可以使用" Join"指令将每个数组值连接到一个字符串中。
要在Access中合并行,您可能需要看起来像这样的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| 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 |
您将需要添加错误处理代码并清理您的记录集,如果您使用ADO而不是DAO,这会稍有改变,但是总体思路是相同的。
尽管Nz可以与COALESCE相比,但是您不能在Access中使用它来执行您要执行的操作。构建行值列表的不是COALESCE,而是连接到变量中。
不幸的是,在必须具有单个SQL语句且没有声明变量的工具的Access查询中,这是不可能的。
我认为您需要创建一个函数,该函数将打开结果集,对其进行迭代,然后将行值连接为字符串。
我认为Nz是您的追求,语法是Nz(variant, [if null value])。这是文档链接:Nz函数
1 2 3 4 5 6 7 8 9 10
| ---Person---
John
Steve
Richard
DECLARE @PersonList nvarchar(1024)
SELECT @PersonList = Nz(@PersonList + ',','') + Person
FROM PersonTable
PRINT @PersonList |