MySQL-Auswahl mit CONCAT-Bedingung

116

Ich versuche dies in meinem Kopf zu kompilieren. Ich habe eine Tabelle mit Vor- und Nachnamenfeldern und ich habe eine Zeichenfolge wie "Bob Jones" oder "Bob Michael Jones" und mehrere andere.

Die Sache ist, ich habe zum Beispiel Bob im Vornamen und Michael Jones im Nachnamen

Also versuche ich es

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

aber es heißt unbekannte Spalte "firstlast" .. kann jemand bitte helfen?

Alex K.
quelle

Antworten:

177

Die von Ihnen angegebenen Aliase gelten für die Ausgabe der Abfrage. Sie sind in der Abfrage selbst nicht verfügbar.

Sie können entweder den Ausdruck wiederholen:

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

oder schließen Sie die Abfrage ein

SELECT * FROM (
  SELECT neededfield, CONCAT(firstname, ' ', lastname) as firstlast 
  FROM users) base 
WHERE firstLast = "Bob Michael Jones"
mdma
quelle
5
Dies sollte als Antwort festgelegt werden.
Arun Killu
Nach einer Weile kann ich sagen, dass ich damit einverstanden bin, dies als bessere Antwort zu verwenden
Alex K
@ Alex können Sie eine andere Antwort auswählen, wenn Sie dies möchten
Gypaetus
1
Für eine sperrige Tabelle mit vielen Zeilen halte ich es für unklug, die Version "Wrap the Query" zu verwenden.
Fandi Susanto
34

Versuche dies:

SELECT * 
  FROM  (
        SELECT neededfield, CONCAT(firstname, ' ', lastname) as firstlast 
        FROM users 
    ) a
WHERE firstlast = "Bob Michael Jones"
Chandu
quelle
funktioniert perfekt für mich, vielen Dank :) und danke für das Einfügen von Text in den Code, ich habe vergessen
Alex K
10
SELECT needefield, CONCAT(firstname, ' ',lastname) as firstlast 
FROM users 
WHERE CONCAT(firstname, ' ', lastname) = "Bob Michael Jones"
Jeff Swensen
quelle
8

Verwenden Sie CONCAT_WS ().

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

Das erste Argument ist das Trennzeichen für den Rest der Argumente.

Viraj Dhamal
quelle
so sollte es dann seinCONCAT_WS(' ', ..
Alex K
7

Versuchen:

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

Ihr Alias ​​firstlast ist in der where-Klausel der Abfrage nur verfügbar, wenn Sie die Abfrage als Unterauswahl ausführen.

RC.
quelle
7

Es gibt eine Alternative zum Wiederholen des CONCATAusdrucks oder zum Verwenden von Unterabfragen. Sie können die HAVINGKlausel verwenden, die Spaltenaliasnamen erkennt.

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

Hier ist eine funktionierende SQL-Geige .

Bogdan
quelle
Ich bin mir nicht sicher, warum die Haben-Klausel nicht mehr Aufmerksamkeit erregt. Es ermöglicht die direkte Verwendung des virtuellen Spaltennamens. Hat die have-Klausel mehr Overhead?
Paul
@Paul mit Klausel am Ende der Ausführung der Abfrage angewendet, damit wir damit Bedingungen für Aggregatfunktionen festlegen können (wie MAX ()). Mit der Klausel kann der Index nicht verwendet werden, daher ist er langsam.
Mostafa Vatanpour