MySQL เลือกด้วยเงื่อนไข CONCAT


116

ฉันพยายามรวบรวมสิ่งนี้ไว้ในใจ .. ฉันมีตารางที่มีฟิลด์ชื่อและนามสกุลและฉันมีสตริงเช่น "Bob Jones" หรือ "Bob Michael Jones" และอื่น ๆ อีกมากมาย

สิ่งนี้คือฉันมีตัวอย่างเช่น Bob ในชื่อแรกและ Michael Jones ในนามสกุล

ดังนั้นฉันกำลังพยายาม

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

แต่มันขึ้นว่าไม่รู้จักคอลัมน์ "firstlast" .. ใครช่วยได้ไหม

คำตอบ:


177

นามแฝงที่คุณระบุมีไว้สำหรับผลลัพธ์ของการสืบค้น - ไม่สามารถใช้ได้ในแบบสอบถามนั้นเอง

คุณสามารถทำซ้ำนิพจน์:

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

หรือตัดข้อความค้นหา

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

5
นี่คือการตั้งค่าเป็นคำตอบ
Arun Killu

หลังจากนั้นไม่นานฉันสามารถพูดได้ว่าฉันตกลงที่จะใช้สิ่งนี้เป็นคำตอบที่ดีกว่า
Alex K

@ Alex คุณสามารถเลือกคำตอบอื่นได้หากต้องการ
gypaetus

1
สำหรับตารางขนาดใหญ่ที่มีหลายแถวฉันคิดว่าคงไม่ฉลาดที่จะใช้เวอร์ชัน "ตัดคำค้นหา"
Fandi Susanto

34

ลองสิ่งนี้:

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

ทำงานได้สมบูรณ์แบบสำหรับฉันขอบคุณมาก :) และขอบคุณสำหรับการใส่ข้อความในรหัสฉันลืม
Alex K


8

ใช้ CONCAT_WS ()

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

อาร์กิวเมนต์แรกคือตัวคั่นสำหรับอาร์กิวเมนต์ที่เหลือ


ดังนั้นมันควรจะเป็นCONCAT_WS(' ', ..
Alex K

7

ลอง:

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

นามแฝงของคุณ firstlast ไม่พร้อมใช้งานในส่วนคำสั่งของการค้นหาเว้นแต่คุณจะทำการค้นหาเป็นการเลือกย่อย


7

มีทางเลือกอื่นในการทำซ้ำCONCATนิพจน์หรือใช้เคียวรีย่อย คุณสามารถใช้ประโยชน์จากHAVINGอนุประโยคซึ่งรู้จักนามแฝงของคอลัมน์

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

นี่คือSQL Fiddle ที่ใช้งานได้


ไม่แน่ใจว่าเหตุใดการมีประโยคจึงไม่ได้รับความสนใจมากขึ้น อนุญาตให้ใช้ชื่อคอลัมน์เสมือนได้โดยตรง ประโยคมีค่าใช้จ่ายมากกว่านี้หรือไม่?
พอล

@Paul มีการใช้อนุประโยคในตอนท้ายของการดำเนินการค้นหาเพื่อให้เราสามารถใช้เพื่อตั้งเงื่อนไขในฟังก์ชันรวม (เช่น MAX ()) การมีอนุประโยคไม่สามารถใช้ดัชนีได้จึงช้า
Mostafa Vatanpour
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.