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?

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"

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"

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"

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.


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.


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 .


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.