MySQL seleziona con la condizione CONCAT


116

Sto cercando di compilare questo nella mia mente .. ho una tabella con i campi nome e cognome e ho una stringa come "Bob Jones" o "Bob Michael Jones" e molti altri.

il fatto è che ho per esempio Bob nel nome e Michael Jones nel cognome

quindi ci sto provando

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

ma dice la colonna sconosciuta "firstlast" .. qualcuno può aiutare per favore?

Risposte:


177

Gli alias forniti sono per l'output della query: non sono disponibili all'interno della query stessa.

Puoi ripetere l'espressione:

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

o avvolgere la query

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

5
questo doveva essere impostato come risposta.
Arun Killu

dopo un po ', posso dire che accetto di usarlo come una risposta migliore
Alex K

@Alex puoi selezionare una risposta diversa se lo desideri
gypaetus

1
Per una tabella ingombrante con molte righe, penso che non sarebbe saggio utilizzare la versione "wrap the query".
Fandi Susanto

34

Prova questo:

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

funziona perfettamente per me, grazie mille :) e grazie per aver inserito il testo nel codice, ho dimenticato
Alex K

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

8

Usa CONCAT_WS ().

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

Il primo argomento è il separatore per il resto degli argomenti.


quindi dovrebbe essereCONCAT_WS(' ', ..
Alex K

7

Provare:

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

Il tuo alias firstlast non è disponibile nella clausola where della query a meno che non esegui la query come selezione secondaria.


7

C'è un'alternativa alla ripetizione CONCATdell'espressione o all'uso di sottoquery. È possibile utilizzare la HAVINGclausola, che riconosce gli alias di colonna.

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

Ecco un violino SQL funzionante .


Non sono sicuro del motivo per cui la clausola di avere non sta ottenendo più attenzione. Consente l'uso diretto del nome della colonna virtuale. La clausola avere ha più spese generali?
Paul

@Paul ha una clausola applicata alla fine dell'esecuzione della query in modo che possiamo usarla per impostare la condizione sulle funzioni aggregate (come MAX ()). La clausola avere non può utilizzare l'indice, quindi è lento.
Mostafa Vatanpour
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.