我有以下應用了基本 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但評估為布林值。展示這一點的正確方法是什么?
uj5u.com熱心網友回復:
語法不關心語意。
從語法上講,運算式就是運算式,僅此而已。如果您稍后進行某種語意分析,那么您就需要處理差異。您可能會在對conditionand的縮減操作中這樣做,from_expression 但在決議時僅構建 AST 并稍后在樹上進行語意分析會更清晰。
uj5u.com熱心網友回復:
一種選擇如下,并附有示例:
expression:
literal # 'abc', 1,
column # Table.Field1, Table.Profit
function call # ABS(...)
operator invocation # NOT field1, 2 3, Genres[0], Genres[1:2], Address.name
condition:
expression { = | != | < | <= | > | >= | IN } expression # Revenue > 0
expression IS [NOT] NULL # Revenue IS NOT NULL
condition { AND | OR } condition # Revenue > 0 AND Profit < 100
uj5u.com熱心網友回復:
這是一條不適合評論區的評論。
我對提供 LiveSQL 實作的鏈接猶豫不決,因為它是專門針對 Java 語言的,它是開源的,但我們從未添加任何檔案。閱讀風險自負。
主類是LiveSQL.java:在第 113 行,您可以看到 select 子句的主要變體。它有許多變體,但這是一種允許開發人員根據需要包含盡可能多的結果集列(運算式)的變體:
public SelectColumnsPhase<Map<String, Object>> select(
final ResultSetColumn... resultSetColumns) {
return new SelectColumnsPhase<Map<String, Object>>(this.sqlDialect,
this.sqlSession, this.liveSQLMapper, false,
resultSetColumns);
}
當然,SELECT 子句還有許多其他變體,如果您稍微探索一下,您可以在同一個類中找到它們。當我研究所有變體時,我認為我非常詳盡。它應該 [大部分] 完整,除了我沒有考慮的非標準 SQL 方言變體。
如果您在 WHERE 階段跟隨 QueryBuilder,您可以看到如何where(final Predicate predicate)在SelectFrom.java類的方法(第 101 行)中組裝謂詞,如下所示:
public SelectWherePhase<R> where(final Predicate predicate) {
return new SelectWherePhase<R>(this.select, predicate);
}
如您所見,WHERE 子句不接受任何型別的運算式。首先,它只接受一個運算式,而不是一個串列。其次這個運算式必須是一個謂詞(布爾運算式)。當然,這個謂詞可以隨心所欲,混合各種運算式和布爾邏輯。您可以查看Predicate.java類來探索所有可以構建的運算式。
健康)狀況
讓我們以上面描述的 Predicate 類為例。如果p和q是布爾運算式并且a, b,c是 [主要] 任何型別,您可以將條件表示為:
condition:
<predicate>
predicate:
p and q,
p or q,
not p,
( p ),
a == b,
a <> b,
a > b,
a < b,
a >= b,
a <= b,
a between b and c,
a not between b and c,
a in (b, c, ... )
a not in (b, c, ... )
當然,還有更多的運算子,但這為您提供了要點。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/342537.html
