【发布时间】:2021-12-10 01:18:51
【问题描述】:
我有以下应用了基本 BNF 的 SQL 语句:
SELECT
from_expression [, from_expression] ...
FROM
from_source
WHERE
condition
from_source:
table_name
from_expression:
literal # 'abc', 1,
column # Table.Field1, Table.Profit
function # ABS(...)
operator invocation # NOT field1, 2+3, Genres[0], Genres[1:2], Address.name
condition:
???
目前WHERE 条件与from_expression 相同,但被评估为布尔值。什么是正确的展示方式?
【问题讨论】:
-
可能从括号、连词、析取开始,然后是支持的条件类型(在这个简化的语法中可能限制了操作数的产生)。与其他语言不同,文字不是条件的有效表达式。在语法中没有必要表明“被评估为布尔值”。
-
这是一个浓缩的提取物,可能看起来像:
cond_or: cond or cond, cond: expr = expr | expr < expr | expr is null, expr: literal | identifier等。expr 不会直接反馈给 cond。 -
@David542 我编写了 ORM 的 LiveSQL 模块,它允许开发人员即时组装通用选择语句。作为一般规则,SQL 表达式可以分为 6 种类型表达式,具体取决于它们的结果类型(数值、字符串、时间、布尔值、二进制等)。您的“来自表达式”可以是六种类型表达式中的任何一种,而您的“条件”只能是布尔表达式(又名“谓词”)。
-
@David542 像 MySQL 这样的引擎更宽松,它们不仅接受布尔表达式,还接受条件中的数字表达式;我相信任何不同于零的结果都被解释为真实。但是,我会认为这是规则的一个例外,符合规范并且只考虑过滤谓词的布尔表达式可能更安全。
-
@David542 我希望我的解释能帮助你朝着正确的方向前进。写这篇文章真的让我很兴奋,在这个过程中我学到了很多 SQL 怪癖。
标签: sql parsing grammar context-free-grammar bnf