首页 > 解决方案 > 在实际查询数据之前,如何验证 SQL 谓词的输出是否与另一个 SQL 谓词的输出相交?

问题描述

是否有任何已知的算法或库可以帮助确定 SQL 谓词是否包含在另一个 SQL 谓词中?

这些谓词将出现在此语句之后

SELECT * FROM table1 WHERE ... 

例如,让我们看看这个谓词

name = Smith

我想检查该谓词是否包含在以下谓词中:

(company = Walmart OR hobby = baseball) AND (NOT (name != Smith))

我试图弄清楚第二个谓词的输出是否有可能包含第一个谓词的输出。在查询实际数据之前需要此信息。

约束:

  1. 不允许嵌套谓词。
  2. 只允许使用以下运算符:AND OR NOT BETWEEN IN IS。

标签: mysqlsqlpostgresqlpartiql

解决方案


真值表可以帮助解决这个问题。

您可以将布尔表达式中的每个术语表示为真或假。或者等效地,导致每个术语为真或假的不同可能输入。

为这些的每一种组合制作一张表格。

公司 爱好 姓名 结果
沃尔玛 棒球 史密斯 真的
沃尔玛 高尔夫球 史密斯 真的
好市多 高尔夫球 史密斯 FALSE
好市多 高尔夫球 琼斯 错误的
沃尔玛 棒球 琼斯 错误的

还有其他组合,但我将它们排除在外。

然后为要测试的谓词制作一个真值表:name = Smith

公司 爱好 姓名 结果
沃尔玛 棒球 史密斯 真的
沃尔玛 高尔夫球 史密斯 真的
好市多 高尔夫球 史密斯 TRUE
好市多 高尔夫球 琼斯 错误的
沃尔玛 棒球 琼斯 错误的

第二个谓词不是第一个谓词的子集,因为在第一个谓词中,至少有一组输入的结果为 FALSE,即使结果name = Smith为真。我强调了与第一个谓词不同的结果。

我的答案中缺少的是一种解析布尔表达式并识别术语的方法,以便您可以制作真值表。这取决于您使用什么语言,等等。您可以在 Stack Overflow 上搜索类似问题的答案:https ://stackoverflow.com/search?q=parse+sql+boolean+expression

至于推荐可以为您执行此操作的库或软件产品,这超出了 Stack Overflow 答案的范围。主题问题指南明确指出,本网站并非旨在为软件库或工具提供建议。


推荐阅读