跨数据库表中的行验证给定条件

Posted

技术标签:

【中文标题】跨数据库表中的行验证给定条件【英文标题】:Validate given conditions across the rows in a database table 【发布时间】:2020-09-10 12:59:27 【问题描述】:

我有一个这样的位置和对应值的数据库表

position    value

Z170S11     630
Z176S11     103
Z060S11     7162
Z143S01     47

'position' 对于这个表是唯一的。位置的集合是固定的。 'value' 列的行条目将随着应用程序的每次新运行而改变。

我也有一个关于此表中所有值的固定条件列表。此列表是我要存储在数据库中的 Excel 文件的一部分。该列表有这样的条目

left hand side       operator    right hand side

Z143S01 + Z060S11    =           Z176S11     
Z143S01              >=          Z170S11

左右两边都可以包含最多 10 个不同值的和和差。运算符有 '='、'='。

对于每个条件,我都需要检查当前的“值”字段是否正确。例如

Z143S01 + Z060S11 = Z176S11

将评估为

47 + 7162 = 103

这是错误的。每次检查的结果都应该呈现给用户。

将这些条件存储为我的数据库的一部分并自动检查它们是否满足上表中的给定值的好方法是什么?

我想将它们作为字符串值存储在表格中,并使用 VBA 的“Split”和“DLookup”函数单独评估每一行。正如我预计要检查的大约 1.000 个条件一样,这可能会变得太慢。有没有更简单/更快的方法,可能更多地依赖 SQL?

【问题讨论】:

您能否提供更多详细信息 @VishalSheth 你在想什么细节?更多示例行?我对实际输出格式持开放态度 @VishalSheth 我更新了问题并提供了更多详细信息 是强制使用 SQL DLookup 函数还是使用某种脚本很好 行得通的就是好的。问题主要是关于存储条件的好方法,因为它们不会改变。我希望该过程尽可能干净地检查它们。拆分字符串并使用 DLookups 的脚本可能会变得非常混乱。 【参考方案1】:

自定义函数打开位置记录集,循环记录并对条件表达式字符串执行替换操作,Eval() 函数计算新字符串,返回 True 或 False。

Function TestVal(sStr As String)
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("SELECT * FROM Positions")
Do While Not rs.EOF
    sStr = Replace(sStr, rs!Position, rs![Value])
    rs.MoveNext
Loop
Debug.Print sStr
TestVal = Eval(sStr)
End Function

可以在查询或文本框中调用函数。SELECT Conditions.*, TestVal([LeftSide] & [Operator] & [RightSide]) AS IsTrue FROM Conditions;

【讨论】:

这对我很有用。应该注意的是,该解决方案假定作为条件一部分的每个位置也具有值。如果不是这种情况,则 Eval 将中断。我可以通过为所有位置添加 0 值来解决这个问题。谢谢! 或者在查询表达式中使用 Nz() 或 IIf() 如果字段为空,则强制为 0。 或者在函数中处理可能的Null。不止一种方式...

以上是关于跨数据库表中的行验证给定条件的主要内容,如果未能解决你的问题,请参考以下文章

根据 3 到 4 个条件对数据库表中的行进行计数和分组查询

联结表

通过替换给定列的值来显示表中的行

外连接查询

case 语句中的多个条件重复表中的行

在 LibreOffice Calc 中对不同表中的行(“条件副本”)进行分组