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 ")"
不是重复的。
我问如何使 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 ")"