DQL 原则在哪里与 CASE 一起使用?

mar*_*ixy 2 php sql orm doctrine dql

不是重复的。

我问如何使 CASE 工作,或者为什么它不起作用(特别是考虑到相同的 CASE 表达式在纯 SQL 中工作)。我不是在寻找替代解决方案。


我正在使用 Doctrine ORM(及其 SQL 派生查询语言 - DQL)并尝试在 WHERE 子句中使用 CASE 表达式创建 DQL 查询,但 Doctrine 向我抛出错误。

数据质量: 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) 按其应有的方式工作。

mar*_*ixy 5

在同事的帮助下,根据DQL 的形式语法,我做错的是尝试使用不受支持的功能

目前(从 Doctrine v2.6 开始)DQL 根本不支持对条件表达式求值的 CASE 表达式。它只能评估ScalarExpression语法中定义的 a ,而不能是 的实例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 ")"
Run Code Online (Sandbox Code Playgroud)