MySQL select com condição CONCAT

116

Estou tentando compilar isso em minha mente .. eu tenho uma tabela com campos de nome e sobrenome e tenho uma string como "Bob Jones" ou "Bob Michael Jones" e vários outros.

o que acontece é que tenho, por exemplo, Bob no primeiro nome e Michael Jones no sobrenome

então estou tentando

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

mas diz coluna desconhecida "firstlast" .. alguém pode ajudar por favor?

Alex K
fonte

Respostas:

177

Os aliases fornecidos são para a saída da consulta - eles não estão disponíveis na própria consulta.

Você pode repetir a expressão:

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

ou envolva a consulta

SELECT * FROM (
  SELECT neededfield, CONCAT(firstname, ' ', lastname) as firstlast 
  FROM users) base 
WHERE firstLast = "Bob Michael Jones"
mdma
fonte
5
isso deveria ser definido como resposta.
Arun Killu
depois de um tempo, posso dizer que concordo em usar isso como uma resposta melhor
Alex K
@Alex você pode selecionar uma resposta diferente se quiser
gypaetus
1
Para uma tabela volumosa com muitas linhas, acho que não seria aconselhável usar a versão "embrulhar a consulta".
Fandi Susanto
34

Experimente isto:

SELECT * 
  FROM  (
        SELECT neededfield, CONCAT(firstname, ' ', lastname) as firstlast 
        FROM users 
    ) a
WHERE firstlast = "Bob Michael Jones"
Chandu
fonte
funciona perfeitamente para mim, muito obrigado :) e obrigado por colocar o texto no código, esqueci
Alex K
10
SELECT needefield, CONCAT(firstname, ' ',lastname) as firstlast 
FROM users 
WHERE CONCAT(firstname, ' ', lastname) = "Bob Michael Jones"
Jeff Swensen
fonte
8

Use CONCAT_WS ().

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

O primeiro argumento é o separador para o resto dos argumentos.

Viraj Dhamal
fonte
então deveria serCONCAT_WS(' ', ..
Alex K
7

Experimentar:

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

Seu alias firstlast não está disponível na cláusula where da consulta, a menos que você faça a consulta como uma sub-seleção.

RC.
fonte
7

Existe uma alternativa para repetir a CONCATexpressão ou usar subconsultas. Você pode usar a HAVINGcláusula, que reconhece apelidos de coluna.

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

Aqui está um SQL Fiddle funcional .

Bogdan
fonte
Não sei por que a cláusula having não está chamando mais atenção. Permite o uso direto do nome da coluna virtual. A cláusula having tem mais overhead?
Paulo
@Paul tendo uma cláusula aplicada no final da execução da consulta para que possamos usá-la para definir a condição nas funções de agregação (como MAX ()). Ter a cláusula não pode usar o índice, por isso é lento.
Mostafa Vatanpour