2012-03-12 88 views
6

问题

我在查询中使用备用列名(化名),我可以使用别名“GIVEN_NAME”作为ORDER BY的一部分,但是无法使用它作为其一部分WHERE子句。该WHERE“GIVEN_NAME”传递作为我的控制的请求的结果,我不知道应该在WHERE条件下使用实际的列名。列别名WHERE子句

问题

  1. 这有什么办法/破解一个WHERE子句中使用列别名?
  2. 有没有办法找到一个别名列名?

研究

一些研究它看起来像别名是在WHERE子句后添加后后。

SELECT profile.id AS id, given.name AS 'given_name', family.name AS 'family_name' 
FROM green_profile profile 
LEFT JOIN green_name given ON given.profileid = profile.id AND given.name_typeid = 0 
LEFT JOIN green_name family ON family.profileid = profile.id AND family.name_typeid = 1 
WHERE given_name LIKE 'levi%' 
ORDER BY given_name DESC LIMIT 0 , 25 

回答

4

未经检验的,但这个技巧应该工作...

SELECT * FROM ( 
    SELECT profile.id AS id, given.name AS 'given_name', family.name AS 'family_name' 
    FROM green_profile profile 
    LEFT JOIN green_name given ON given.profileid = profile.id AND given.name_typeid = 0 
    LEFT JOIN green_name family ON family.profileid = profile.id AND family.name_typeid = 1 
) as temptable 
WHERE given_name LIKE 'levi%' 
ORDER BY given_name DESC LIMIT 0 , 25 

它的工作原理通过简单地创建一个临时表从您的原始选择语句(没有where子句和排序),其中有列na你指定的mes。然后,您可以从中选择所需的列名。

一个更好的办法是创建一个视图,你想要的列名,并从视图中选择...

CREATE VIEW newtable AS 
SELECT profile.id AS id, given.name AS 'given_name', family.name AS 'family_name' 
FROM green_profile profile 
LEFT JOIN green_name given ON given.profileid = profile.id AND given.name_typeid = 0 
LEFT JOIN green_name family ON family.profileid = profile.id AND family.name_typeid = 1; 

然后......

SELECT * FROM newtable 
WHERE given_name LIKE 'levi%' 
ORDER BY given_name DESC LIMIT 0 , 25 
+0

谢谢,很好的解释。然而,两种解决方案都可以在对一张大桌子进行基准测试之后,视图解决方案提供更好的性能 – 2012-03-12 10:12:35

+0

我怀疑可能是这样,因为这将只需要对视图做充分的select语句一次,然后可以缓存和索引,以备日后调用(不知道这个细节是如何工作的)。我预计表现会稍好单指原始列名,而不是对付视图中的所有在一起的,但是希望不是这么大的差别。 – 2012-03-12 10:20:55

1

在怀疑,仅仅指的是通过列数:

... 
ORDER BY 2 
... 
+0

会不会是更好用全称'given.name'?列顺序并不是一个强有力的方法 – 2012-03-12 09:43:51

+0

这可以工作,但是由于客户端请求超出了我的控制范围,因此“given_name”被传入。我无法确定列号或“given_name”是given.name的别名。 – 2012-03-12 10:16:14

3

你可以仅在GROUP BY,ORDER BY或HAVING子句中使用列别名。

标准SQL不允许你引用列别名WHERE子句。这种限制是因为在执行WHERE代码时,列值可能还没有确定。