簡體   English   中英

教義DQL在哪里?

[英]Doctrine DQL WHERE with CASE?

不能重復。

我問如何使CASE起作用,或為什么它不起作用(特別是考慮到相同的CASE表達式在純SQL中起作用)。 我不是在尋找替代解決方案。


我正在使用Doctrine ORM(及其SQL派生查詢語言-DQL),並嘗試在WHERE子句中使用CASE表達式創建DQL查詢,但是Doctrine向我拋出錯誤。

DQL:在SELECT p FROM Entity\\Product p WHERE (CASE WHEN p.price < 20 THEN p.quantity >= 30 ELSE p.quantity > 5 END)

我收到以下錯誤:
[Syntax Error] line 0, col 87: Error: Expected Doctrine\\ORM\\Query\\Lexer::T_ELSE, got '>'
(大約>= 30以上)

我不知道我在做什么錯。 我知道DQL支持CASE表達式。 我已經找到了使用它們的答案。 至少堆棧跟蹤有一個解析器調用來確認這一點。

相同的SQL語句:
SELECT p.* FROM product p WHERE (CASE WHEN p.price < 20 THEN p.quantity >= 30 ELSE p.quantity > 5 END)可以正常工作。

在一位同事的幫助下,並基於DQL的正式語法 ,我做錯了嘗試使用不受支持的功能

目前(從Doctrine v2.6開始),DQL根本不支持將CASE表達式評估為條件表達式 它只能對語法中定義的ScalarExpression求值,該語法不能是ConditionalExpression的實例。

ScalarExpression      ::= SimpleArithmeticExpression | StringPrimary | DateTimePrimary | StateFieldPathExpression | BooleanPrimary | CaseExpression | InstanceOfExpression
CaseExpression        ::= GeneralCaseExpression | SimpleCaseExpression | CoalesceExpression | NullifExpression
GeneralCaseExpression ::= "CASE" WhenClause {WhenClause}* "ELSE" ScalarExpression "END"
WhenClause            ::= "WHEN" ConditionalExpression "THEN" ScalarExpression
SimpleCaseExpression  ::= "CASE" CaseOperand SimpleWhenClause {SimpleWhenClause}* "ELSE" ScalarExpression "END"
CaseOperand           ::= StateFieldPathExpression | TypeDiscriminator
SimpleWhenClause      ::= "WHEN" ScalarExpression "THEN" ScalarExpression
CoalesceExpression    ::= "COALESCE" "(" ScalarExpression {"," ScalarExpression}* ")"
NullifExpression      ::= "NULLIF" "(" ScalarExpression "," ScalarExpression ")"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM