首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >原则DQL案件在哪里?

原则DQL案件在哪里?
EN

Stack Overflow用户
提问于 2018-11-01 13:29:01
回答 1查看 1.7K关注 0票数 1

不是复制品。

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

我正在使用Doctrine (以及它的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支持案例表达式。我找到了利用它们的答案。至少堆栈跟踪有一个解析器调用来确认这一点。

相同的SQL语句:

SELECT p.* FROM product p WHERE (CASE WHEN p.price < 20 THEN p.quantity >= 30 ELSE p.quantity > 5 END)按其应有的方式工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-01 15:51:17

在同事的帮助下,基于DQL的形式语法,我所做的错误是尝试使用一个不受支持的特性。

目前(Doctrinev2.6),DQL根本不支持将案例表达式计算为条件表达式。它只能计算为语法中定义的ScalarExpression,而该语法不能是ConditionalExpression的实例。

代码语言:javascript
复制
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 ")"
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53102319

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档