Selección de MySQL con condición CONCAT

116

Estoy tratando de compilar esto en mi mente ... tengo una tabla con campos de nombre y apellido y tengo una cadena como "Bob Jones" o "Bob Michael Jones" y varias otras.

la cosa es que tengo, por ejemplo, Bob en el nombre y Michael Jones en el apellido

así que estoy tratando de

SELECT neededfield, CONCAT(firstname, ' ', lastname) as firstlast 
  FROM users 
 WHERE firstlast = "Bob Michael Jones"

pero dice columna desconocida "firstlast" .. ¿alguien puede ayudar por favor?

Alex K
fuente

Respuestas:

177

Los alias que da son para la salida de la consulta; no están disponibles dentro de la consulta en sí.

Puede repetir la expresión:

SELECT neededfield, CONCAT(firstname, ' ', lastname) as firstlast 
FROM users
WHERE CONCAT(firstname, ' ', lastname) = "Bob Michael Jones"

o envuelve la consulta

SELECT * FROM (
  SELECT neededfield, CONCAT(firstname, ' ', lastname) as firstlast 
  FROM users) base 
WHERE firstLast = "Bob Michael Jones"
mdma
fuente
5
esto fue para establecer como respuesta.
Arun Killu
después de un tiempo, puedo decir que estoy de acuerdo en usar esto como una mejor respuesta
Alex K
@Alex puede seleccionar una respuesta diferente si lo desea
gypaetus
1
Para una tabla voluminosa con muchas filas, creo que no sería prudente utilizar la versión "ajustar la consulta".
Fandi Susanto
34

Prueba esto:

SELECT * 
  FROM  (
        SELECT neededfield, CONCAT(firstname, ' ', lastname) as firstlast 
        FROM users 
    ) a
WHERE firstlast = "Bob Michael Jones"
Chandu
fuente
funciona perfecto para mí, muchas gracias :) y gracias por poner texto en el código, lo olvidé
Alex K
10
SELECT needefield, CONCAT(firstname, ' ',lastname) as firstlast 
FROM users 
WHERE CONCAT(firstname, ' ', lastname) = "Bob Michael Jones"
Jeff Swensen
fuente
8

Utilice CONCAT_WS ().

SELECT CONCAT_WS(' ',firstname,lastname) as firstlast FROM users 
WHERE firstlast = "Bob Michael Jones";

El primer argumento es el separador del resto de argumentos.

Viraj Dhamal
fuente
entonces debería serCONCAT_WS(' ', ..
Alex K
7

Tratar:

SELECT neededfield, CONCAT(firstname, ' ', lastname) as firstlast 
  FROM users 
WHERE CONCAT(firstname, ' ', lastname) = "Bob Michael Jones"

Su alias firstlast no está disponible en la cláusula where de la consulta a menos que realice la consulta como una sub-selección.

RC.
fuente
7

Existe una alternativa para repetir la CONCATexpresión o utilizar subconsultas. Puede hacer uso de la HAVINGcláusula, que reconoce los alias de columna.

SELECT 
  neededfield, CONCAT(firstname, ' ', lastname) AS firstlast 
FROM
  users 
HAVING firstlast = "Bob Michael Jones"

Aquí hay un violín SQL en funcionamiento .

Bogdan
fuente
No estoy seguro de por qué la cláusula de tener no atrae más atención. Permite el uso directo del nombre de la columna virtual. ¿La cláusula de tener tiene más gastos generales?
Paul
@Paul tiene una cláusula aplicada al final de la ejecución de la consulta para que podamos usarla para establecer la condición en funciones agregadas (como MAX ()). Tener una cláusula no puede usar el índice, por lo que es lento.
Mostafa Vatanpour