Wybór MySQL z warunkiem CONCAT

116

Próbuję to skompilować w myślach ... Mam tabelę z polami imię i nazwisko oraz ciąg znaków, taki jak „Bob Jones” lub „Bob Michael Jones” i kilka innych.

chodzi o to, że mam na przykład Bob w imieniu i Michael Jones w nazwisku

więc próbuję

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

ale jest napisane w nieznanej kolumnie „firstlast”… czy ktoś może mi pomóc?

Alex K.
źródło

Odpowiedzi:

177

Aliasy, które podajesz, służą do wyjścia zapytania - nie są dostępne w samym zapytaniu.

Możesz powtórzyć wyrażenie:

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

lub zawiń zapytanie

SELECT * FROM (
  SELECT neededfield, CONCAT(firstname, ' ', lastname) as firstlast 
  FROM users) base 
WHERE firstLast = "Bob Michael Jones"
mdma
źródło
5
to była odpowiedź.
Arun Killu
po chwili mogę powiedzieć, że zgadzam się użyć tego jako lepszej odpowiedzi
Alex K
@Alex, jeśli chcesz, możesz wybrać inną odpowiedź
gypaetus
1
W przypadku obszernej tabeli z wieloma wierszami myślę, że nierozsądne byłoby użycie wersji „zawijaj zapytanie”.
Fandi Susanto
34

Spróbuj tego:

SELECT * 
  FROM  (
        SELECT neededfield, CONCAT(firstname, ' ', lastname) as firstlast 
        FROM users 
    ) a
WHERE firstlast = "Bob Michael Jones"
Chandu
źródło
działa idealnie dla mnie, wielkie dzięki :) i dzięki za umieszczenie tekstu w kodzie, zapomniałem
Alex K
10
SELECT needefield, CONCAT(firstname, ' ',lastname) as firstlast 
FROM users 
WHERE CONCAT(firstname, ' ', lastname) = "Bob Michael Jones"
Jeff Swensen
źródło
8

Użyj CONCAT_WS ().

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

Pierwszy argument jest separatorem dla pozostałych argumentów.

Viraj Dhamal
źródło
więc powinno byćCONCAT_WS(' ', ..
Alex K
7

Próbować:

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

Twój alias firstlast nie jest dostępny w klauzuli where zapytania, chyba że wykonasz zapytanie jako sub-select.

RC.
źródło
7

Istnieje alternatywa dla powtórzenia CONCATwyrażenia lub użycia podzapytań. Możesz skorzystać z HAVINGklauzuli, która rozpoznaje aliasy kolumn.

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

Oto działające skrzypce SQL .

Bogdana
źródło
Nie wiem, dlaczego klauzula posiadania nie przyciąga większej uwagi. Pozwala na bezpośrednie użycie nazwy wirtualnej kolumny. Czy klauzula posiadania ma większy narzut?
Paul
@Paul ma klauzulę zastosowaną na końcu wykonywania zapytania, dzięki czemu możemy użyć jej do ustawienia warunku dla funkcji agregujących (takich jak MAX ()). Klauzula nie może używać indeksu, więc jest powolna.
Mostafa Vatanpour,