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?

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"

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"

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"

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.


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.


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 .


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.