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)
按其应有的方式工作。
在同事的帮助下,根据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)
归档时间: |
|
查看次数: |
2125 次 |
最近记录: |