Me parece que te estás complicando innecesariamente.
Salvo que vayas a usar la tabla devuelta por la consulta "cruda", para algo, esa tabla la vas a visualizar en una aplicación (web o de escritorio). Entonces
la aparición o no de la columna es algo que debes resolver en la aplicación. No en la consulta.
De esa forma el problema se simplificaría, y no necesitarías hacer un método dinámico, que por otro lado no puedes implementar en el servidor.
Además de eso, yo no le veo practicidad a que te devuelva un valor NULL en una columna, ya que las aplicaciones suelen tener problemas a la hora de manejar esos valores. En todo caso lo reemplazaría por un caracter vacío (''), que trae menos complicaciones.
La idea sería entonces:
Código MySQL:
Ver original IF( t4.Dir_Descripcion
= t3.Dir_Descripcion
, '', t1.Dir_Descripcion
) AS dato1
, IF( t4.Dir_Descripcion
= t3.Dir_Descripcion
, t1.Dir_Descripcion
, t2.Dir_Descripcion
) AS dato2
, IF( t4.Dir_Descripcion
= t3.Dir_Descripcion
, t2.Dir_Descripcion
, t3.Dir_Descripcion
) AS dato3
, IF( t4.Dir_Descripcion
= t3.Dir_Descripcion
, t3.Dir_Descripcion
, t4.Dir_Descripcion
) AS dato4
tabla_datos
AS t1
INNER JOIN tabla_datos
AS t2
ON t1.Dir_Codigo
= t2.Dep_Codigo
t1.Dir_Codigo = '605231000000'
Estoy reemplazando tu WHERE por INNER JOIN en el cruce de tablas porque
un WHERE no es optimizable por el parser de MySQL y
un FROM si. Es mucho más eficiente (y es la forma correcta de igualar campos relacionados entre tablas, si lo buscas en los manuales de SQL).
Por lo demás, no entiendo la lógica de la consulta, porque estas cruzando cuatro veces la misma tabla para obtener cierto dato en todas las columnas, pero usando siempre la misma comparación de las mismas tablas... ¿No se podría lograr lo mismo usando
una sola tabla?