2013-11-26 48 views
4

的SQL查詢,我查詢:使用情況/時/然後在Zend框架2

SELECT user_name, group_id, 
     CASE WHEN col_1 = 1 THEN 0 
      WHEN col_2 = 1 THEN 1 
      WHEN col_3 = 1 THEN 2 
     END as merge_col 
FROM some_table 
WHERE group_id = 10 
ORDER BY merge_col. 

如何使用ZF2的Zend \ .. \ SQL,我可以實現這個查詢?

更新:

感謝誰試圖幫助我。它的工作如下:

$select->columns(array(
      'user_name', 
      'group_id', 
      'merge_col' => new Expression('CASE WHEN col_1 = 1 THEN 0 
        WHEN col_2 = 1 THEN 1 
        WHEN col_3 = 1 THEN 2 END'))) 
->where (array('group_id'=> 10)) 
->order ('merge_col'); 

有沒有更好的答案?

謝謝。

+0

你也可以在Expression對象使用''不是數字,以便ZF2可以瞰它?'新的表達(「CASE WHEN COL_1 =那麼當COL_2 =那麼當col_3 =呢?????? END',array(1,0,1,1,1,2))' –

回答

0

使用Zend \ DB \ SQL \表達:

use Zend\Db\Sql; 
    .... 

    $sql = $this->tableGateway->getSql(); 
    $select = $sql->select(); 
    $select->columns(array('user_name', 'group_id', 
      new Sql\Expression('CASE WHEN col_1 = 1 THEN 0 
        WHEN col_2 = 1 THEN 1 
        WHEN col_3 = 1 THEN 2 
         END as merge_col'))); 

    return $this->tableGateway->selectWith($select); 
5
$select = $sql->select ('some_table'); 
$select->columns(array(
      new Expression('CASE WHEN col_1 = 1 THEN 0 
        WHEN col_2 = 1 THEN 1 
        WHEN col_3 = 1 THEN 2 
         END AS merge_col'), 'user_name', 'group_id')) 
->where ('group_id = 10') 
->order ('merge_col'); 
+0

不幸的是,它不起作用,我收到** Zend \ Db \ Adapter \ Exception \ InvalidQueryException **。但是,根據您的答案,我找到了正確的解決方案查看問題更新。謝謝。 –

+0

我也讚賞你的答案,並使其參數化。 – NullPointer

2

下面是參數爲您解決問題的一個更好的辦法。您更新的答案解決了我的問題,但隨後使用參數化更好。

$case = 'CASE '; 
$sqlCase = $this->getAdapter(); 
$case .= $sqlCase->quoteInto('WHEN col_1 = 1 THEN ? ', yourVariable, Zend_Db::INT_TYPE); 
$case .= $sqlCase->quoteInto('WHEN col_2 = 1 THEN ? ', yourVariable, Zend_Db::INT_TYPE); 
$case .= $sqlCase->quoteInto('WHEN col_2 = 1 THEN ? ', yourVariable, Zend_Db::INT_TYPE); 
$case .= 'ELSE 0 END '; 


及以下你的代碼的其餘部分。只要看看我在上面的代碼中生成的變量$case。爲什麼$case是字符串?因爲Zend_Db_Expr需要String值。

$select =$this->getAdapter(); 
$select->columns(array(
      'user_name', 
      'group_id', 
      'merge_col' => new Zend_Db_Expr($case))) 
     ->where (array('group_id'=> 10)) 
     ->order ('merge_col');