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.
a veces usted mismo es útil que el motor de búsqueda :) –
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. –
@RichHarding Me alegro de ayudarte :) –