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?

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"

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"

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"

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.


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.


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 .


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.