Pilih MySQL dengan kondisi CONCAT

116

Saya mencoba untuk mengkompilasi ini dalam pikiran saya .. saya memiliki tabel dengan bidang nama depan dan nama belakang dan saya memiliki string seperti "Bob Jones" atau "Bob Michael Jones" dan beberapa lainnya.

Masalahnya, saya punya misalnya Bob di nama depan, dan Michael Jones di nama belakang

jadi saya mencoba

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

tapi tertulis kolom "firstlast" yang tidak diketahui .. ada yang bisa membantu?

Alex K
sumber

Jawaban:

177

Alias ​​yang Anda berikan adalah untuk keluaran kueri - alias tidak tersedia dalam kueri itu sendiri.

Anda bisa mengulangi ekspresi:

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

atau gabungkan kueri

SELECT * FROM (
  SELECT neededfield, CONCAT(firstname, ' ', lastname) as firstlast 
  FROM users) base 
WHERE firstLast = "Bob Michael Jones"
mdma
sumber
5
ini ditetapkan sebagai jawaban.
Arun Killu
setelah beberapa saat, saya dapat mengatakan bahwa saya setuju untuk menggunakan ini sebagai jawaban yang lebih baik
Alex K
@Alex Anda dapat memilih jawaban yang berbeda jika Anda ingin melakukannya
gypaetus
1
Untuk tabel besar dengan banyak baris, menurut saya tidak bijaksana menggunakan versi "bungkus kueri".
Fandi Susanto
34

Coba ini:

SELECT * 
  FROM  (
        SELECT neededfield, CONCAT(firstname, ' ', lastname) as firstlast 
        FROM users 
    ) a
WHERE firstlast = "Bob Michael Jones"
Chandu
sumber
berfungsi sempurna untuk saya, terima kasih banyak :) dan terima kasih telah memasukkan teks ke dalam kode, saya lupa
Alex K
10
SELECT needefield, CONCAT(firstname, ' ',lastname) as firstlast 
FROM users 
WHERE CONCAT(firstname, ' ', lastname) = "Bob Michael Jones"
Jeff Swensen
sumber
8

Gunakan CONCAT_WS ().

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

Argumen pertama adalah pemisah untuk argumen lainnya.

Viraj Dhamal
sumber
jadi seharusnyaCONCAT_WS(' ', ..
Alex K
7

Mencoba:

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

Alias ​​firstlast Anda tidak tersedia di klausa kueri di mana kecuali Anda melakukan kueri sebagai sub-pilih.

RC.
sumber
7

Ada alternatif untuk mengulang CONCATekspresi atau menggunakan subkueri. Anda dapat menggunakan HAVINGklausa, yang mengenali alias kolom.

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

Ini adalah SQL Fiddle yang berfungsi .

Bogdan
sumber
Tidak yakin mengapa klausa having tidak menarik lebih banyak perhatian. Ini memungkinkan penggunaan langsung nama kolom virtual. Apakah klausa having memiliki lebih banyak overhead?
Paul
@Paul memiliki klausa yang diterapkan di akhir kueri yang dieksekusi sehingga kita dapat menggunakannya untuk mengatur kondisi pada fungsi agregat (seperti MAX ()). Memiliki klausa tidak dapat menggunakan indeks sehingga lambat.
Mostafa Vatanpour