Mysql在哪里搜索使用重命名的列

时间:2014-09-01 13:01:49

标签: mysql sql sql-order-by where-clause

我正在尝试对左连接执行搜索和排序查询,如下所示:

QUERY

SELECT 
IFNULL(TABLE1.NAME, TABLE2.NAME) AS NAME 
FROM TABLE1 LEFT JOIN TABLE2 ON ...
WHERE NAME LIKE "%QUERY%"
ORDER BY NAME ASC;

问题是服务器返回错误Unknown column 'NAME',但是如果我删除where子句,order by子句运行正常。另一方面,如果我将where子句更改为

WHERE IFNULL(TABLE1.NAME, TABLE2.NAME) LIKE "%QUERY%"

然后查询工作。但它在代码中带来了一些混乱,我更喜欢在where子句中使用重命名的列名。也许我错过了一些东西,或者在where子句中使用重命名的列是不可能的?

1 个答案:

答案 0 :(得分:0)

SQL不允许使用SELECT子句中WHERE中定义的列别名。这是因为WHERE子句在SELECT之前进行了逻辑解析。

此问题的常规SQL解决方案是使用子查询:

SELECT t.*
FROM (SELECT IFNULL(TABLE1.NAME, TABLE2.NAME) AS NAME 
      FROM TABLE1 LEFT JOIN TABLE2 ON ...
     ) t
WHERE NAME LIKE '%QUERY%'
ORDER BY NAME ASC;

虽然这适用于所有数据库,但由于两个原因,它不适合MySQL。首先,子查询已实现,这会产生开销。其次,查询无法进入视图。相反,MySQL扩展了HAVING子句,因此你可以这样做:

SELECT IFNULL(TABLE1.NAME, TABLE2.NAME) AS NAME 
FROM TABLE1 LEFT JOIN TABLE2 ON ...
HAVING NAME LIKE '%QUERY%'
ORDER BY NAME ASC;

另外,你应该习惯只使用单引号作为字符串和日期常量,然后在这种情况下总是使用它们。