Выбор MySQL с условием CONCAT

Я пытаюсь скомпилировать это в уме. У меня есть таблица с полями имени и фамилии, и у меня есть строка типа «Боб Джонс» или «Боб Майкл Джонс» и несколько других.

Дело в том, что у меня, например, в имени Боб, а в фамилии Майкл Джонс.

поэтому я пытаюсь

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

но там написано неизвестный столбец "firstlast".. кто-нибудь может помочь?


person Alex K    schedule 20.04.2011    source источник


Ответы (5)


Псевдонимы, которые вы даете, предназначены для вывода запроса - они недоступны в самом запросе.

Вы можете либо повторить выражение:

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"
person mdma    schedule 20.04.2011
comment
это должно было быть установлено как ответ. - person Arun Killu; 16.01.2013
comment
через некоторое время я могу сказать, что согласен использовать это как лучший ответ - person Alex K; 14.05.2013
comment
@ Алекс, ты можешь выбрать другой ответ, если хочешь. - person gypaetus; 08.08.2013
comment
Я думаю, что для громоздкой таблицы с большим количеством строк было бы неразумно использовать версию запроса с переносом. - person Fandi Susanto; 14.12.2013

Попробуй это:

SELECT * 
  FROM  (
        SELECT neededfield, CONCAT(firstname, ' ', lastname) as firstlast 
        FROM users 
    ) a
WHERE firstlast = "Bob Michael Jones"
person Chandu    schedule 20.04.2011
comment
работает идеально для меня, большое спасибо :) и спасибо за размещение текста в коде, я забыл - person Alex K; 20.04.2011

Используйте CONCAT_WS().

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

Первый аргумент является разделителем для остальных аргументов.

person Viraj Dhamal    schedule 20.01.2014
comment
тогда должно быть CONCAT_WS(' ', .. - person Alex K; 30.01.2014

Пытаться:

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

Ваш псевдоним firstlast недоступен в предложении where запроса, если вы не выполняете запрос как подзапрос.

person RC.    schedule 20.04.2011

Существует альтернатива повторению выражения CONCAT или использованию подзапросов. Вы можете использовать предложение HAVING, которое распознает псевдонимы столбцов.

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

Вот рабочий скрипт SQL.

person Bogdan    schedule 10.01.2014
comment
Не уверен, почему предложение с наличием не привлекает больше внимания. Это позволяет напрямую использовать имя виртуального столбца. Имеет ли предложение have больше накладных расходов? - person Paul; 18.03.2014
comment
@Paul имеет предложение, применяемое в конце выполнения запроса, поэтому мы можем использовать его для установки условия для агрегатных функций (например, MAX()). Наличие предложения не может использовать индекс, поэтому оно медленное. - person Mostafa Vatanpour; 05.07.2016