Sélection MySQL avec condition CONCAT

116

J'essaye de compiler ceci dans mon esprit .. j'ai une table avec les champs de prénom et de nom et j'ai une chaîne comme "Bob Jones" ou "Bob Michael Jones" et plusieurs autres.

le truc c'est que j'ai par exemple Bob en prénom et Michael Jones en nom de famille

alors j'essaye de

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

mais il dit colonne inconnue "firstlast" .. quelqu'un peut-il aider s'il vous plaît?

Alex K
la source

Réponses:

177

Les alias que vous donnez sont pour la sortie de la requête - ils ne sont pas disponibles dans la requête elle-même.

Vous pouvez soit répéter l'expression:

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

ou encapsuler la requête

SELECT * FROM (
  SELECT neededfield, CONCAT(firstname, ' ', lastname) as firstlast 
  FROM users) base 
WHERE firstLast = "Bob Michael Jones"
mdma
la source
5
c'était pour définir comme réponse.
Arun Killu
après un certain temps, je peux dire que j'accepte d'utiliser cela comme une meilleure réponse
Alex K
@Alex, vous pouvez sélectionner une réponse différente si vous le souhaitez
gypaetus
1
Pour une table volumineuse avec de nombreuses lignes, je pense qu'il ne serait pas judicieux d'utiliser la version "wrap the query".
Fandi Susanto
34

Essaye ça:

SELECT * 
  FROM  (
        SELECT neededfield, CONCAT(firstname, ' ', lastname) as firstlast 
        FROM users 
    ) a
WHERE firstlast = "Bob Michael Jones"
Chandu
la source
fonctionne parfaitement pour moi, merci beaucoup :) et merci d'avoir mis du texte dans le code, j'ai oublié
Alex K
10
SELECT needefield, CONCAT(firstname, ' ',lastname) as firstlast 
FROM users 
WHERE CONCAT(firstname, ' ', lastname) = "Bob Michael Jones"
Jeff Swensen
la source
8

Utilisez CONCAT_WS ().

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

Le premier argument est le séparateur du reste des arguments.

Viraj Dhamal
la source
alors ça devrait êtreCONCAT_WS(' ', ..
Alex K
7

Essayer:

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

Votre alias firstlast n'est pas disponible dans la clause where de la requête, sauf si vous effectuez la requête en tant que sous-sélection.

RC.
la source
7

Il existe une alternative à la répétition de l' CONCATexpression ou à l'utilisation de sous-requêtes. Vous pouvez utiliser la HAVINGclause, qui reconnaît les alias de colonne.

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

Voici un SQL Fiddle fonctionnel .

Bogdan
la source
Je ne sais pas pourquoi la clause d’avoir ne retient pas davantage l’attention. Il permet l'utilisation directe du nom de la colonne virtuelle. La clause ayant plus de frais généraux?
Paul
@Paul ayant la clause appliquée à la fin de l'exécution de la requête afin que nous puissions l'utiliser pour définir la condition sur les fonctions d'agrégation (comme MAX ()). La clause ayant ne peut pas utiliser l'index, donc c'est lent.
Mostafa Vatanpour