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