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?

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"

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"

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"

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.


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.


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 .


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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.