Вибір MySQL з умовою CONCAT


116

Я намагаюся скласти це на увазі. У мене є таблиця з полями імені та прізвища, і у мене є рядок типу "Боб Джонс" або "Боб Майкл Джонс" та кілька інших.

річ у тому, що у мене є, наприклад, Боб на ім'я та Майкл Джонс за прізвищем

тому я намагаюся

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

але це говорить невідомий стовпчик "firstlast" .. може хто-небудь допомогти, будь ласка?

Відповіді:


177

Псевдоніми, які ви даєте, призначені для виведення запиту - вони недоступні в межах самого запиту.

Ви можете повторити вираз:

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

або заверніть запит

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

5
це було встановлено як відповідь.
Арун Кіллу

через деякий час я можу сказати, що я згоден використовувати це як кращу відповідь
Алекс К

@Alex ви можете вибрати іншу відповідь, якщо ви хочете зробити це
gypaetus

1
Для об'ємної таблиці з багатьма рядками, я думаю, було б нерозумно використовувати версію "обгортання запиту".
Фанді Сусанто

34

Спробуйте це:

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

працює ідеально для мене, велике спасибі :) і спасибі за введення тексту в код, я забув
Alex K


8

Використовуйте CONCAT_WS ().

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

Перший аргумент - це роздільник для решти аргументів.


тож так і має бутиCONCAT_WS(' ', ..
Алекс К

7

Спробуйте:

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

Ваш псевдонім firstlast недоступний у пункті запиту де, якщо ви не зробите запит як під-вибір.


7

Існує альтернатива повторення CONCATвиразу або використанню підзапитів. Ви можете скористатися HAVINGпунктом, який розпізнає псевдоніми стовпців.

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

Ось робоча скрипка SQL .


Не впевнений, чому присутність цього пункту не привертає більшої уваги. Це дозволяє безпосередньо використовувати ім’я віртуальної колонки. Чи є у зауваження, що має, більше накладних витрат?
Павло

@Paul, що в кінці виконання запиту застосовано застереження, тому ми можемо використовувати його для встановлення умови для сукупних функцій (як MAX ()). Маючи пункт не може використовувати індекс, тому це повільно.
Мостафа Ватанпур
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.