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?

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"

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"

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"

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.


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.


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 .


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.