2011-04-20 28 views
92

Estoy tratando de compilar esto en mi mente ... tengo una tabla con los campos firstname y lastname y tengo una cadena como "Bob Jones" o "Bob Michael Jones" y muchos otros.MySQL seleccionar con condición CONCAT

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

así que estoy tratando de

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

pero dice desconocido columna "firstlast" .. ¿Alguien puede ayudar, por favor?

Respuesta

149

Los alias le dan son para la salida de la consulta - que no están disponibles dentro de la propia consulta.

puede repetir la expresión:

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

o envuelva 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. –

+0

después de un tiempo, puedo decir que acepto usar esto como una mejor respuesta –

+0

@Alex puedes seleccionar una respuesta diferente si deseas hacerlo –

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

Probar:

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

Su firstlast alias no está disponible en la cláusula where de la consulta a menos que haga la consulta como un sub-select.

33

Prueba esto:

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

funciona perfecto para mí, gracias mucho :) y gracias por poner el texto en el código, me olvidé –

7

Hay una alternativa a la repetición de la expresión CONCAT o el uso de subconsultas. Puede utilizar la cláusula HAVING, que reconoce alias de columna.

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

Aquí está un SQL Fiddle trabajando.

+0

No estoy seguro de por qué la cláusula having no está atrayendo más atención. Permite el uso directo del nombre de la columna virtual.¿La cláusula having tiene más sobrecarga? – Paul

+0

@Paul que tiene una cláusula aplicada al final de la ejecución de la consulta para que podamos usarla para establecer la condición en las funciones agregadas (como MAX()). La cláusula having no puede usar el índice, por lo que es lento. –

8

Utilice CONCAT_WS().

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

El primer argumento es el separador para el resto de los argumentos.

+0

entonces debería ser 'CONCAT_WS ('', ..' –

-2

1.I tener dos tablas table1 y table2 2.In tabla1 nombre de campo es cert_no y en nombre de campo es table2cer1,cert2,cert3,cert4,cert5 3.El valor que no estaba en table2 (cer1,cert2,cert3,cert4,cert5) solo desea mostrar 4.En tanto tabla tiene mismo valor Sólo transfile_file desea mostrar

consulta lo que he puesto es

SELECT * FROM table1 WHERE folio = 'KCA00619' AND cm_flag !='X' AND certificate_no NOT IN 
(SELECT CONCAT(certno1,certno2,certno3,certno4,certno5,certno6,certno7,certno8,certno9,certno10) 
FROM table2 WHERE tofolio = '123456')