mysql - 在实际查询数据之前,如何验证 SQL 谓词的输出是否与另一个 SQL 谓词的输出相交?
问题描述
是否有任何已知的算法或库可以帮助确定 SQL 谓词是否包含在另一个 SQL 谓词中?
这些谓词将出现在此语句之后
SELECT * FROM table1 WHERE ...
例如,让我们看看这个谓词
name = Smith
我想检查该谓词是否包含在以下谓词中:
(company = Walmart OR hobby = baseball) AND (NOT (name != Smith))
我试图弄清楚第二个谓词的输出是否有可能包含第一个谓词的输出。在查询实际数据之前需要此信息。
约束:
- 不允许嵌套谓词。
- 只允许使用以下运算符:AND OR NOT BETWEEN IN IS。
解决方案
真值表可以帮助解决这个问题。
您可以将布尔表达式中的每个术语表示为真或假。或者等效地,导致每个术语为真或假的不同可能输入。
为这些的每一种组合制作一张表格。
公司 | 爱好 | 姓名 | 结果 |
---|---|---|---|
沃尔玛 | 棒球 | 史密斯 | 真的 |
沃尔玛 | 高尔夫球 | 史密斯 | 真的 |
好市多 | 高尔夫球 | 史密斯 | FALSE |
好市多 | 高尔夫球 | 琼斯 | 错误的 |
沃尔玛 | 棒球 | 琼斯 | 错误的 |
还有其他组合,但我将它们排除在外。
然后为要测试的谓词制作一个真值表:name = Smith
公司 | 爱好 | 姓名 | 结果 |
---|---|---|---|
沃尔玛 | 棒球 | 史密斯 | 真的 |
沃尔玛 | 高尔夫球 | 史密斯 | 真的 |
好市多 | 高尔夫球 | 史密斯 | TRUE |
好市多 | 高尔夫球 | 琼斯 | 错误的 |
沃尔玛 | 棒球 | 琼斯 | 错误的 |
第二个谓词不是第一个谓词的子集,因为在第一个谓词中,至少有一组输入的结果为 FALSE,即使结果name = Smith
为真。我强调了与第一个谓词不同的结果。
我的答案中缺少的是一种解析布尔表达式并识别术语的方法,以便您可以制作真值表。这取决于您使用什么语言,等等。您可以在 Stack Overflow 上搜索类似问题的答案:https ://stackoverflow.com/search?q=parse+sql+boolean+expression
至于推荐可以为您执行此操作的库或软件产品,这超出了 Stack Overflow 答案的范围。主题问题指南明确指出,本网站并非旨在为软件库或工具提供建议。
推荐阅读
- reactjs - 加载屏幕 ReactJS
- android - 使用材质样式(PrimarySurface)在暗模式下获取工具栏高程
- java - quarcus maven插件无法创建项目
- php - 在一行中显示我表中的重复数据一次
- c++ - 当标头和实现分开时,静态或未命名的命名空间仍然有用吗?
- c# - ASP.NET 核心将自动创建的数据库放在哪里?
- r - R:并行处理错误:“checkForRemoteErrors(val) 中的错误:5 个节点产生错误;第一个错误:找不到 Objekt 'RAD'”
- vue.js - 在 Vue3 上配置 Pusher
- java - @RequestMapping 处理特殊字符
- angular - 使用管道后如何修改我的数据流?