Выбор 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 K
@Alex, вы можете выбрать другой ответ, если хотите
gypaetus
1
Для громоздкой таблицы с большим количеством строк, я думаю, было бы неразумно использовать версию «обернуть запрос».
Fandi Susanto
34

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

SELECT * 
  FROM  (
        SELECT neededfield, CONCAT(firstname, ' ', lastname) as firstlast 
        FROM users 
    ) a
WHERE firstlast = "Bob Michael Jones"
Chandu
источник
отлично работает для меня, большое спасибо :) и спасибо, что поместили текст в код, я забыл
Alex K
10
SELECT needefield, CONCAT(firstname, ' ',lastname) as firstlast 
FROM users 
WHERE CONCAT(firstname, ' ', lastname) = "Bob Michael Jones"
Джефф Свенсен
источник
8

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

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

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

Вирадж Дхамал
источник
Так и должно бытьCONCAT_WS(' ', ..
Alex K
7

Пытаться:

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

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

RC.
источник
7

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

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

Вот рабочий SQL Fiddle .

Богдан
источник
Не уверен, почему предложение о наличии не привлекает больше внимания. Это позволяет напрямую использовать имя виртуального столбца. Имеет ли предложение иметь дополнительные накладные расходы?
Пол
@Paul имеет предложение, примененное в конце выполнения запроса, чтобы мы могли использовать его для установки условия для агрегатных функций (например, MAX ()). Предложение Have не может использовать индекс, поэтому оно работает медленно.
Мостафа Ватанпур 05