Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何获取ms access中的最后一个非空列_Sql_Vba_Database_Ms Access - Fatal编程技术网

Sql 如何获取ms access中的最后一个非空列

Sql 如何获取ms access中的最后一个非空列,sql,vba,database,ms-access,Sql,Vba,Database,Ms Access,所以我有一个巨大的数据库用于我的学校项目 身份证件 团队 游戏1 得分1 游戏2 得分2 游戏3 得分3 1. 巴萨 vs真实 2-1 vs bvb 5-2 vs亚特兰蒂斯 0-3 2. 皇家马德里 vs巴萨 1-2 比蒂斯 3-0 3. 曼城 vs曼联 1-2 假设缺少的值为null,则可以使用nz(): 请注意,这在任何其他数据库中都会更简单。标准SQL函数coalesce()接受多个参数: select id, team, coalesce(game3, game2, gam

所以我有一个巨大的数据库用于我的学校项目

身份证件 团队 游戏1 得分1 游戏2 得分2 游戏3 得分3 1. 巴萨 vs真实 2-1 vs bvb 5-2 vs亚特兰蒂斯 0-3 2. 皇家马德里 vs巴萨 1-2 比蒂斯 3-0 3. 曼城 vs曼联 1-2
假设缺少的值为
null
,则可以使用
nz()

请注意,这在任何其他数据库中都会更简单。标准SQL函数
coalesce()
接受多个参数:

select id, team,
       coalesce(game3, game2, game1) as last_game
from t;

假设缺少的值为
null
,则可以使用
nz()

请注意,这在任何其他数据库中都会更简单。标准SQL函数
coalesce()
接受多个参数:

select id, team,
       coalesce(game3, game2, game1) as last_game
from t;

有一件事已经被评论过了,那就是您的数据库设计需要被修复——您不需要像在Excel中那样进行遍历,而是作为表中的额外行进行遍历。需要注意的访问表中的字段限制为255个

但是,如果您决定坚持这样做,另一种方法是创建一个小型VBA函数,将字段向后循环以获得所需的答案。比如:

Function fLastMatch(lngTeamID As Long) As String
    On Error GoTo E_Handle
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim strSQL As String
    Dim lngLoop1 As Long
    Set db = DBEngine(0)(0)
    strSQL = "SELECT * FROM tblFootball WHERE id=" & lngTeamID
    Set rs = db.OpenRecordset(strSQL)
    If Not (rs.BOF And rs.EOF) Then
        For lngLoop1 = rs.Fields.Count - 2 To 2 Step -2
            If Not IsNull(rs.Fields(lngLoop1)) Then
                fLastMatch = rs.Fields(lngLoop1)
                Exit For
            End If
        Next lngLoop1
    End If
fExit:
    On Error Resume Next
    rs.Close
    Set rs = Nothing
    Set db = Nothing
    Exit Function
E_Handle:
    MsgBox Err.Description & vbCrLf & vbCrLf & "fLastMatch", vbOKOnly + vbCritical, "Error: " & Err.Number
    Resume fExit
End Function
这是因为记录集中的最后一个(第n个)字段位于位置n-1,因为记录集是0索引的(第一个字段位于位置0,第二个字段位于位置1…)。这意味着最后一个匹配字段位于位置n-2。我们从字段中的这个位置开始,检查是否有数据。如果有,我们已经找到了最后一场比赛,可以退出循环。如果没有数据,那么我们返回两个字段,回到上一个匹配,然后重复检查

然后,您可以在查询中使用此函数来获得所需的答案:

SELECT id, fLastMatch(id) AS LastMatch
FROM tblFootball;
这种方法意味着您不必担心包含多少个匹配项,如果随着时间的推移而发生变化(这在数据库中是个坏主意),则可以在中添加正确数量的
Nz
s


关于,

有一件事已经被评论过了,那就是您的数据库设计需要被修复——您不需要像在Excel中那样进行遍历,而是作为表中的额外行进行遍历。需要注意的访问表中的字段限制为255个

但是,如果您决定坚持这样做,另一种方法是创建一个小型VBA函数,将字段向后循环以获得所需的答案。比如:

Function fLastMatch(lngTeamID As Long) As String
    On Error GoTo E_Handle
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim strSQL As String
    Dim lngLoop1 As Long
    Set db = DBEngine(0)(0)
    strSQL = "SELECT * FROM tblFootball WHERE id=" & lngTeamID
    Set rs = db.OpenRecordset(strSQL)
    If Not (rs.BOF And rs.EOF) Then
        For lngLoop1 = rs.Fields.Count - 2 To 2 Step -2
            If Not IsNull(rs.Fields(lngLoop1)) Then
                fLastMatch = rs.Fields(lngLoop1)
                Exit For
            End If
        Next lngLoop1
    End If
fExit:
    On Error Resume Next
    rs.Close
    Set rs = Nothing
    Set db = Nothing
    Exit Function
E_Handle:
    MsgBox Err.Description & vbCrLf & vbCrLf & "fLastMatch", vbOKOnly + vbCritical, "Error: " & Err.Number
    Resume fExit
End Function
这是因为记录集中的最后一个(第n个)字段位于位置n-1,因为记录集是0索引的(第一个字段位于位置0,第二个字段位于位置1…)。这意味着最后一个匹配字段位于位置n-2。我们从字段中的这个位置开始,检查是否有数据。如果有,我们已经找到了最后一场比赛,可以退出循环。如果没有数据,那么我们返回两个字段,回到上一个匹配,然后重复检查

然后,您可以在查询中使用此函数来获得所需的答案:

SELECT id, fLastMatch(id) AS LastMatch
FROM tblFootball;
这种方法意味着您不必担心包含多少个匹配项,如果随着时间的推移而发生变化(这在数据库中是个坏主意),则可以在中添加正确数量的
Nz
s


关于,

如果表中不包含每个游戏的两个字段,那么会简单得多,但这可能是对数据库的完全重新设计。因此,我得到的是“nz()”函数只使用了两个参数,我有大约15个游戏,我认为这是不可能的,我不能在ms access中使用“COALESCE()”。我能找到别的办法吗?@SiMoh。只要继续嵌套
nz()
s.@DarrenBartrup-Cook。大概也许不是。这毕竟是MS Access。如果表中不包含每个游戏的两个字段,那会简单得多,但这可能是对数据库的完全重新设计。因此,我得到的是“nz()”函数只使用了两个参数,我有大约15个游戏,我认为这是不可能的,我不能在MS Access中使用“COALESCE()”。我能找到别的办法吗?@SiMoh。只要继续嵌套
nz()
s.@DarrenBartrup-Cook。大概也许不是。这毕竟是MS Access。Soooo我正试图解开这个谜团(别误会,它就像魔术一样工作)谢谢。我编辑了答案,包括对代码核心部分正在做什么以及为什么的解释。Soooo我正试图解开这个谜团(别误会,它就像魔术一样工作)谢谢我已经编辑了答案,包括对代码核心部分所做的事情以及原因的解释。