2011-04-20 111 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')