2013-11-26 6 views
4

의 SQL 쿼리에 내가 쿼리가있을 때 :사용 케이스// 다음 젠드 프레임 워크 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젠드 \ .. \ 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

또한'사용할 수'대신 숫자 식 개체 ZF2 그것을 촉각 근 수 :'새로운 식 ('CASE WHEN 컬럼 col_1 = THEN WHEN col_2에는 = THEN WHEN col_3이 = THEN?????? END ', array (1, 0, 1, 1, 1, 2))' –

답변

0

사용 젠드 \ 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_ExprString 값이 필요합니다.

$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');