Вибір 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.