【问题标题】:MySQL select with CONCAT condition带有 CONCAT 条件的 MySQL 选择
【发布时间】:2011-04-20 17:57:44
【问题描述】:

我正在尝试在脑海中编译这个.. 我有一个包含名字和姓氏字段的表 我有一个字符串,比如“Bob Jones”或“Bob Michael Jones”等等。

问题是,例如,我有 鲍勃的名字,和 迈克尔·琼斯的姓

所以我正在尝试

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

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

【问题讨论】:

    标签: mysql select conditional-statements where concat


    【解决方案1】:

    您提供的别名用于查询的输出 - 它们在查询本身中不可用。

    您可以重复该表达式:

    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"
    

    【讨论】:

    • 这是设置为答案。
    • 一段时间后,我可以说我同意将此作为更好的答案
    • @Alex,如果您愿意,可以选择不同的答案
    • 对于有很多行的大表,我认为使用“包装查询”版本是不明智的。
    【解决方案2】:

    试试这个:

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

    【讨论】:

    • 非常适合我,非常感谢 :) 并感谢您将文本放入代码中,我忘记了
    【解决方案3】:
    SELECT needefield, CONCAT(firstname, ' ',lastname) as firstlast 
    FROM users 
    WHERE CONCAT(firstname, ' ', lastname) = "Bob Michael Jones"
    

    【讨论】:

      【解决方案4】:

      使用 CONCAT_WS()。

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

      第一个参数是其余参数的分隔符。

      【讨论】:

      • 那么应该是CONCAT_WS(' ', ..
      【解决方案5】:

      试试:

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

      除非您将查询作为子选择进行,否则您的别名 firstlast 在查询的 where 子句中不可用。

      【讨论】:

        【解决方案6】:

        除了重复CONCAT 表达式或使用子查询之外,还有另一种方法。您可以使用识别列别名的HAVING 子句。

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

        这是一个有效的SQL Fiddle

        【讨论】:

        • 不确定为什么 having 子句没有引起更多关注。它允许直接使用虚拟列名。 have 子句是否有更多开销?
        • @Paul 在执行查询的末尾应用了子句,因此我们可以使用它来设置聚合函数的条件(如 MAX())。有子句不能使用索引,所以它很慢。
        猜你喜欢
        • 2015-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-17
        相关资源
        最近更新 更多