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?

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"

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"

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"

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.


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.


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 .


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.