2011-03-13 14 views
9

En mi tabla tengo un campo "firstname" y un campo "lastname". Me gustaría seleccionar todos los registros donde firstname + space + lastname tenga un cierto valor.Combinación de dos campos en la instrucción SELECT

He intentado esto:

$sql = "SELECT * FROM sam_users WHERE (user_firstname + ' ' + user_lastname LIKE ?)"; 

Pero esto no está funcionando. Con Google, he encontrado algo sobre el uso de ||, pero realmente no entiendo cómo debería usar ese operador. Tenga en cuenta que no quiero usar un or-operator (qué || está en muchos idiomas), sino algo para concatenar 2 campos (con un espacio entre ellos) y usar un LIKE en eso.

Gracias!

+4

¿Para qué es RDBMS? ¿Y por qué estás usando 'LIKE' en lugar de' = '? –

+0

MySQL, pero estoy usando la biblioteca PDO (PHP) por lo que debe ser portátil. Estoy usando LIKE porque estoy creando un campo de "búsqueda", por lo que el resultado debería ser una lista de todos los usuarios cuyo nombre es como la cadena ingresada. – Bv202

+0

@ Bv202 - No estoy seguro de si hay un método de concatenación de cadenas "más portátil". Me interesará si alguna de las respuestas cubre eso. –

Respuesta

22

Con MySQL, puede utilizar CONCAT:

SELECT * FROM sam_users 
    WHERE CONCAT(user_firstname, ' ', user_lastname) LIKE ? 

o CONCAT_WS (que ignora los valores NULL):

SELECT * FROM sam_users 
    WHERE CONCAT_WS(' ', user_firstname, user_lastname) LIKE ? 

Sin embargo, MySQL no será capaz de utilizar cualquier indices al realizar esta consulta. Si el valor del argumento de patrón a LIKE comienza con un comodín, MySQL no podrá usar índices, por lo que compararlo con un valor generado (en lugar de una columna) no hará la diferencia.

También puede establecer MySQL server SQL mode en "ANSI" o "PIPES_AS_CONCAT" para usar el operador || para la concatenación de cadenas.

SET @@sql_mode=CONCAT_WS(',', @@sql_mode, 'PIPES_AS_CONCAT'); 
SELECT * FROM sam_users 
    WHERE (user_firstname || ' ' || user_lastname) LIKE ? 

Esto establece el modo SQL para el session actual solamente. Tendrá que configurar @@sql_mode cada vez que se conecte. Si desea el modo de desconexión 'PIPES_AS_CONCAT' en una sesión:

SET @@sql_mode=REPLACE(@@sql_mode, 'PIPES_AS_CONCAT', ''); 

MySQL parece eliminar las comas adicionales en @@sql_mode, por lo que no tiene que preocuparse de ellos.

No utilizar SELECT *; selecciona solo las columnas que necesitas

+0

Oh, bueno, demasiado fácil ... de alguna manera me he perdido la palabra clave CONCAT ... Gracias por el enlace con respecto a SELECT *; eso es interesante :) – Bv202

+0

¿Qué hay de usar count (*)? ¿Eso también es malo? – Bv202

+1

@ Bv202: No, en absoluto. 'COUNT (*)' es un caso especial. Las columnas en sí no se examinan para el recuento (aunque sí lo serán para otras cláusulas), solo las filas coincidentes. Incluso sin esta optimización, el cambio de una definición de tabla no afectará 'COUNT (*)' de forma que pueda causar problemas. – outis

1
SELECT * 
FROM sam_users 
WHERE TRIM(Concat(user_firstname, ' ', user_lastname)) LIKE ?; 
2

En SQL el operador ||hace concatenación de cadenas de acuerdo con el estándar (ver SQL 2008: 5.2). El booleano u operador está escrito OR en SQL.

Sin embargo, no todas las bases de datos lo implementan de esta manera, por lo que la sintaxis exacta depende de la base de datos específica.

  • MySQL Server utiliza la función CONCAT.
  • El servidor MSSQL utiliza el operador +.
Cuestiones relacionadas