2012-08-30 7 views
6

En YII, tengo una función que ya trabajan:Agregar caso cuando declaración en objeto de comando Yu SQL

$sql = Yii::app()->db->createCommand(); 
$sql->select('A.name as client_name, B.name as product_name'); 
$sql->join('tableb B', 'A.id=B.product_id'); 
$sql->from('tablea A'); 
$sql->where('1 = 1'); 

Ahora estoy tratando de añadir una lógica diminuta al campo product_name, en MySQL sería

CASE WHEN B.name = "sth" 
THEN B.name 
ELSE B.another_name 
END AS product_name 

¿Es posible agregar este caso cuando el bloque en la función de selección()?

Respuesta

8

Hice la pregunta aquí después de luchar durante 2 horas en Google y busqué mucho aquí. Pero 10 minutos más tarde, descubrí que tengo la respuesta ...

Después de tomar un vistazo al código fuente del método select(), la atención

public function select($columns='*', $option='') 
{ 
    if(is_string($columns) && strpos($columns,'(')!==false) 
     $this->_query['select']=$columns; 
    else 
    { 
     if(!is_array($columns)) 
      $columns=preg_split('/\s*,\s*/',trim($columns),-1,PREG_SPLIT_NO_EMPTY); 

     foreach($columns as $i=>$column) 
     { 
      if(is_object($column)) 
       $columns[$i]=(string)$column; 
      else if(strpos($column,'(')===false) 
      { 
       if(preg_match('/^(.*?)(?i:\s+as\s+|\s+)(.*)$/',$column,$matches)) 
        $columns[$i]=$this->_connection->quoteColumnName($matches[1]).' AS '.$this->_connection->quoteColumnName($matches[2]); 
       else 
        $columns[$i]=$this->_connection->quoteColumnName($column); 
      } 
     } 
     $this->_query['select']=implode(', ',$columns); 
    } 
    if($option!='') 
     $this->_query['select']=$option.' '.$this->_query['select']; 
    return $this; 
} 

atención a la primera sentencia if, cuando se pasa una cadena y contiene "(", la variable $ columnas será devuelto directamente, eso es realmente lo que estoy buscando para

Así que la solución será:

$sql->select('A.name as client_name, (CASE WHEN B.name = "sth" THEN B.name ELSE B.product_name END) as product_name'); 

Tenga cuidado de que la alia s parte "como nombre_producto" debe estar fuera de() sección.

+3

a veces usted mismo es útil que el motor de búsqueda :) –

+0

Gracias, Jinzhao. Podría haberme tomado algo de tiempo para resolver esto, pero gracias a ti me tomó solo el tiempo que pasé tipeando en Google y haciendo clic en este enlace. –

+1

@RichHarding Me alegro de ayudarte :) –

Cuestiones relacionadas