Выбор 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"

отлично работает для меня, большое спасибо :) и спасибо, что поместили текст в код, я забыл
Alex K


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 запроса, если вы не выполняете запрос в качестве подвыбора.


7

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

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

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


Не уверен, почему предложение о наличии не привлекает больше внимания. Это позволяет напрямую использовать имя виртуального столбца. Имеет ли предложение иметь дополнительные накладные расходы?
Пол

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