2011-04-20 149 views
92

我試圖編譯這個在我心中..我有一個名字和姓氏字段表 ,我有一個像「鮑勃瓊斯」或「鮑勃邁克爾瓊斯」等字符串。MySQL選擇CONCAT條件

的事情是,我有例如 鮑勃在姓名和 邁克爾·瓊斯在姓氏

所以我想

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

但它說未知列「firstlast」 ..任何人都可以幫忙嗎?

回答

149

你給是查詢的輸出端的別名 - 他們不是查詢本身內可用。

可以重複上述表達式:

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

這是爲了回答。 – 2013-01-16 09:35:44

+0

經過一段時間,我可以說我同意用這個作爲更好的答案 – 2013-05-14 13:01:35

+0

@Alex如果您希望這樣做,您可以選擇不同的答案 – 2013-08-08 19:32:41

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

嘗試:

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

你的別名firstlast不可查詢的WHERE子句中,除非你做的查詢作爲子選擇。

33

試試這個:

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

工作非常適合我,非常感謝:),並感謝把文本中的代碼,我忘了 – 2011-04-20 18:02:30

7

還有就是要重複CONCAT表達或使用子查詢的替代方案。您可以使用HAVING子句,該子句可識別列別名。

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

這是一個工作SQL Fiddle

+0

不知道爲什麼having子句沒有引起更多關注。它允許直接使用虛擬列名稱。有條款有更多的開銷嗎? – Paul 2014-03-18 17:11:02

+0

@Paul having子句在執行查詢結束時應用,因此我們可以使用它來設置聚合函數(如MAX())的條件。有子句不能使用索引,所以它很慢。 – 2016-07-05 04:15:19

8

使用CONCAT_WS()。

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

第一個參數是其餘參數的分隔符。

+0

那麼它應該是'CONCAT_WS('',..' – 2014-01-30 10:50:06

-2

1.I有兩個表table1table2 2.In table1的字段名是cert_notable2字段名是cer1,cert2,cert3,cert4,cert5 3.值不在table2 (cer1,cert2,cert3,cert4,cert5)單單要顯示 4.如果兩個表中有相同的值只有transfile_file要顯示

查詢什麼,我說就是

SELECT * FROM table1 WHERE folio = 'KCA00619' AND cm_flag !='X' AND certificate_no NOT IN 
(SELECT CONCAT(certno1,certno2,certno3,certno4,certno5,certno6,certno7,certno8,certno9,certno10) 
FROM table2 WHERE tofolio = '123456')