MySQL选择条件条件


116

我正在尝试将其编译。.我有一个带有firstname和lastname字段的表,并且我有一个字符串,例如“ Bob Jones”或“ Bob Michael Jones”以及其他几个字符串。

事实是,例如我姓鲍勃,姓迈克尔·琼斯

所以我想

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

但是它说未知列“ firstlast” ..有人可以帮助吗?

Answers:


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
这是要作为答案。
阿伦·基卢

过了一会儿,我可以说我同意将其用作更好的答案
Alex K


1
对于具有许多行的庞大表,我认为使用“包装查询”版本是不明智的。
Fandi Susanto 2013年

34

试试这个:

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

非常适合我,非常感谢:),也感谢您将文本输入代码中,我忘了
Alex K

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

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在查询的where子句中不可用。


7

有重复CONCAT表达式或使用子查询的替代方法。您可以使用该HAVING子句来识别列别名。

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

这是一个有效的SQL Fiddle


不知道为什么hading子句不会引起更多关注。它允许直接使用虚拟列名称。hading子句是否会有更多开销?
保罗

@Paulaving子句在执行查询的末尾应用,因此我们可以使用它来设置聚合函数(如MAX())的条件。Have子句不能使用索引,因此它很慢。
Mostafa Vatanpour '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.