CONCAT koşuluyla MySQL seçimi


116

Bunu zihnimde derlemeye çalışıyorum .. ad ve soyad alanlarını içeren bir tablom var ve "Bob Jones" veya "Bob Michael Jones" ve diğerleri gibi bir dizem var.

mesele şu ki, örneğin ilk adda Bob ve soyadında Michael Jones var

bu yüzden yapmaya çalışıyorum

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

ama bilinmeyen sütun "ilk son" yazıyor .. Biri lütfen yardım edebilir mi?

Yanıtlar:


177

Verdiğiniz takma adlar sorgunun çıktısı içindir - bunlar sorgunun kendi içinde mevcut değildir.

İfadeyi tekrarlayabilirsiniz:

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

veya sorguyu kaydırın

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

5
bu cevap olarak ayarlanacaktı.
Arun Killu

Bir süre sonra, bunu daha iyi bir cevap olarak kullanmayı kabul ettiğimi söyleyebilirim
Alex K

@Alex, dilerseniz farklı bir cevap seçebilirsiniz
gypaetus

1
Çok sayıda satır içeren hacimli bir tablo için "sorguyu kaydır" versiyonunu kullanmanın akıllıca olmayacağını düşünüyorum.
Fandi Susanto

34

Bunu dene:

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

benim için mükemmel çalışıyor, çok teşekkürler :) ve metni koda koyduğunuz için teşekkürler, unuttum
Alex K

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

8

CONCAT_WS () kullanın.

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

İlk argüman, argümanların geri kalanı için ayırıcıdır.


Öyleyse öyle olmalıCONCAT_WS(' ', ..
Alex K.

7

Deneyin:

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

İlk takma adınız, sorguyu alt seçim olarak yapmadığınız sürece sorgunun where yan tümcesinde kullanılamaz.


7

CONCATİfadeyi tekrarlamak veya alt sorgular kullanmak için bir alternatif vardır . Sen yararlanabilirler HAVINGkolon takma adları tanır maddesi.

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

İşte çalışan bir SQL Fiddle .


Sahip olma cümlesinin neden daha fazla dikkat çekmediğinden emin değilim. Sanal sütun adının doğrudan kullanımına izin verir. Sahip olma cümlesinin daha fazla yükü var mı?
Paul

@Paul, sorguyu yürütmenin sonunda cümlecik uygulandı, böylece onu toplama işlevlerinde (MAX () gibi) koşul ayarlamak için kullanabiliriz. Yan tümce sahip olmak indeksi kullanamaz, bu yüzden yavaştır.
Mostafa Vatanpour
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.