2017-06-12 96 views
1

我有一个存储库功能,我想使用CASE WHEN然后ELSE,但教义不允许在ELSE NULL。当然,我GOOGLE了,但我找不到答案如何避免它。主义CASE WHEN然后是NULL

public function countAverageOdd($user) { 
    return $this->getEntityManager() 
        ->createQuery(' 
          SELECT 
           avg(
            CASE 
             WHEN p.homeAway = \'h\' AND p.moneyline IS NOT NULL THEN m.home 
             WHEN p.homeAway = \'d\' AND p.moneyline IS NOT NULL THEN m.draw 
             WHEN p.homeAway = \'e\' AND p.moneyline IS NOT NULL THEN m.away 
             WHEN p.homeAway = \'h\' AND p.spread IS NOT NULL THEN s.home 
             WHEN p.homeAway = \'e\' AND p.spread IS NOT NULL THEN s.away 
             WHEN p.homeAway = \'h\' AND p.total IS NOT NULL THEN t.over 
             WHEN p.homeAway = \'e\' AND p.total IS NOT NULL THEN t.under 
            ELSE NULL 
            END 
            ) 
          FROM 
           AppBundle:Predictions p 
           LEFT JOIN p.moneyline m 
           LEFT JOIN p.spread s 
           LEFT JOIN p.total t 
          WHERE p.user = :user ') 
        ->setParameter(":user", $user) 
        ->setMaxResults(1) 
        ->getSingleScalarResult(); 
} 

错误:[语法错误] 0行,列900 :错误:意外 'NULL'

https://github.com/doctrine/doctrine2/issues/3160

doctrinebot评论了2013年5月22日

问题以分辨率“不会修复”关闭

请给我建议。

回答

1

我设法通过传递空值作为参数来绕过主义逻辑检查。这是一个黑客攻击,但它似乎是唯一有效的工具。

public function countAverageOdd($user) { 
    return $this->getEntityManager() 
        ->createQuery(' 
          SELECT 
           avg(
            CASE 
             WHEN p.homeAway = \'h\' AND p.moneyline IS NOT NULL THEN m.home 
             WHEN p.homeAway = \'d\' AND p.moneyline IS NOT NULL THEN m.draw 
             WHEN p.homeAway = \'e\' AND p.moneyline IS NOT NULL THEN m.away 
             WHEN p.homeAway = \'h\' AND p.spread IS NOT NULL THEN s.home 
             WHEN p.homeAway = \'e\' AND p.spread IS NOT NULL THEN s.away 
             WHEN p.homeAway = \'h\' AND p.total IS NOT NULL THEN t.over 
             WHEN p.homeAway = \'e\' AND p.total IS NOT NULL THEN t.under 
            ELSE :null 
            END 
            ) 
          FROM 
           AppBundle:Predictions p 
           LEFT JOIN p.moneyline m 
           LEFT JOIN p.spread s 
           LEFT JOIN p.total t 
          WHERE p.user = :user ') 
        ->setParameters(array(":user"=> $user,":null"=>NULL)) 
        ->setMaxResults(1) 
        ->getSingleScalarResult(); 
+0

我可以在下个星期一尝试它,我会发布结果。 – NTsvetkov

+0

谢谢!它的工作原理! – NTsvetkov

1

结帐出myql case operator documentation。该ELSE是可选的,因此你可以将其删除

public function countAverageOdd($user) { 
    return $this->getEntityManager() 
        ->createQuery(' 
          SELECT 
           avg(
            CASE 
             WHEN p.homeAway = \'h\' AND p.moneyline IS NOT NULL THEN m.home 
             WHEN p.homeAway = \'d\' AND p.moneyline IS NOT NULL THEN m.draw 
             WHEN p.homeAway = \'e\' AND p.moneyline IS NOT NULL THEN m.away 
             WHEN p.homeAway = \'h\' AND p.spread IS NOT NULL THEN s.home 
             WHEN p.homeAway = \'e\' AND p.spread IS NOT NULL THEN s.away 
             WHEN p.homeAway = \'h\' AND p.total IS NOT NULL THEN t.over 
             WHEN p.homeAway = \'e\' AND p.total IS NOT NULL THEN t.under 

            END 
            ) 
          FROM 
           AppBundle:Predictions p 
           LEFT JOIN p.moneyline m 
           LEFT JOIN p.spread s 
           LEFT JOIN p.total t 
          WHERE p.user = :user ') 
        ->setParameter(":user", $user) 
        ->setMaxResults(1) 
        ->getSingleScalarResult(); 
+0

不要工作... HTTP://s18.postimg.org/ilgycfsu1/screenshot_203.png – NTsvetkov

+0

也许是我太急于回答,我没有检查,如果这实际上是由教义DQL支持,但我会做。你可以从symfony分析器发布相关*可运行查询*吗? – lordrhodos

+0

运行查询之前它会转储错误。 :-( – NTsvetkov