DQL 哪里有 CASE?

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的formal grammar,我做错的是尝试使用不受支持的功能

目前(从 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 ")"