Mysql的CASE语句用法与Zend(Mysql CASE statement usage wit

2019-09-20 07:41发布

我有以下查询从数据库中选择一些记录:

$select_person = $this->select()
        ->setIntegrityCheck(false)
        ->from(array('a' => 'tableA'), 
                array(new Zend_Db_Expr('SQL_CALC_FOUND_ROWS a.id'),
                        'a.cid',  
                        'a.email',
                        'final' => new Zend_Db_Expr( "concat( '<div 
                            style=\"color:#1569C7; font-weight:bold\">',
                            a.head , ' ' ,  a.tail,  '</div>')" ),
                        'a.red_flag'
                )
        )   
        ->joinLeft(array('b' => 'tableb'), ... blah blah)
        ->where('blah blah')
        ->order('a.head ASC')

我想修改上面的查询,以便它选择了一个不同的值'final'根据价值

a.red_flag.

它可以有值 - 真或假。

我明白我可以使用MySQL的CASE语句 - 比如像下面这样:

'final' => new Zend_Db_Expr("CASE a.red_flag WHEN 'true' THEN '$concatstr1'
                        ELSE '$concatstr2' END")

$concatstr1 = "concat( '<div style=\"color:red; font-weight:bold\">', a.head , ' ' , a.tail, '</div>')" ;

$concatstr2 = "concat( '<div style=\"color:blue; font-weight:bold\">', a.head , ' ' , a.tail, '</div>')" ;

然而,它抛出一个错误说

消息:SQLSTATE [42000]:语法错误或访问冲突:1064您的SQL语法错误; 检查对应于你的MySQL服务器版本使用附近的正确语法手册“DIV的风格=‘颜色:红色;字体重量:大胆’>”,a.head,“”,'第1行

我怎样才能让这个查询的工作? 任何帮助是极大的赞赏。

谢谢

Answer 1:

Personnaly,我不喜欢让HTML从DB的答案。 它变得混乱和难以调试和变化之后。 此外,你可能会得到一些错误,由于与“和”,以及MySQL的所有保留字符混乱(<,>,;,...)我建议你试试这个:

'final' => new Zend_Db_Expr("CASE a.red_flag WHEN 'true' THEN 1
                        ELSE 0 END")

然后做a.red_flag价值的检查;

if($this->final) {
    $output .= '<div style=\"color:red; font-weight:bold\">';
} else {
    $output .= '<div style=\"color:blue; font-weight:bold\">';
}
$output .= $this->head.' '.$this->tail;
$output .= '</div>';

如果查询仍然无法正常工作。 尝试

echo $select->__toString; exit();

并检查查询。 尝试用您的数据库上__toString得到了输出,并检查是否正常工作。 它更容易解决它的方式。 你也可以在这里显示的查询字符串,它会更容易调试。



Answer 2:

最后,我发现在我发言的错误。 罪魁祸首是-我是用引号$concatstr1$concatstr2里面$select_person声明。 正确的查询应形成如下:

$select_person = $this->select()
        ->setIntegrityCheck(false)
        ->from(array('a' => 'tableA'), 
                array(new Zend_Db_Expr('SQL_CALC_FOUND_ROWS a.id'),
                        'a.cid',  
                        'a.email',
                        final' => new Zend_Db_Expr("CASE a.red_flag WHEN 'true' THEN $concatstr1 ELSE $concatstr2 END"),
                        'a.red_flag'
                )
        )   
        ->joinLeft(array('b' => 'tableb'), ... blah blah)
        ->where('blah blah')
        ->order('a.head ASC');

这是现在我回来“的适当的值final ” - concatstr1red_flagtrue ,否则它返回我concatstr2



文章来源: Mysql CASE statement usage with Zend