给出一个带有列col1,col2的表'my_table'。
是否可以编写这样的查询
SELECT col1 as my_alias,col2 FROM my_table WHERE my_alias = 'value'
我已经尝试了但在where子句中获得了一个未知的列'my_alias'。
对于好奇,我这样做的原因是:
我有一张带有复合主键的表。当我从该表中检索信息时,我将构成主键的cols连接成Id,然后可以在我的url中使用它来识别特定记录。然后,当我想只返回给定的记录时,我选择记录所在的位置=我的别名。不确定这是不是一个好主意,随时评论。
注意:执行此查询的标准方法是:
SELECT col1 as my_alias,col2 FROM my_table WHERE col1 = 'value';
答案 0 :(得分:5)
不,不允许。来自MySQL manual:
12.2.8。 SELECT语法
...
不允许在WHERE子句中引用列别名,因为在执行WHERE子句时可能尚未确定列值。见Section C.5.5.4, “Problems with Column Aliases”。
和
C.5.5.4。列别名的问题
可以在查询选择列表中使用别名为列提供不同的名称。您可以使用GROUP BY,ORDER BY或HAVING子句中的别名来引用该列。
...
标准SQL不允许在WHERE子句中引用列别名。
要解决此问题,您应该按如下方式编写查询:
SELECT col1 AS my_alias, col2
FROM my_table
WHERE col1 = 'value'
如果col1
实际上不是单个列而是更复杂的表达式,那么您应该知道在WHERE子句中使用它很可能会阻止索引的有效使用并导致完整扫描。如果表变大,这可能会损害应用程序的性能。
答案 1 :(得分:2)
这不是直接可行的,但您可以使用子选择并在外部选择中使用列别名:
select my_alias, col2
from (SELECT col1 as my_alias,col2 FROM my_table) as x
WHERE my_alias = 'value'
答案 2 :(得分:1)
您可以在HAVING子句中使用它。
答案 3 :(得分:1)
看看这个Can you use an alias in the WHERE clause in mysql?答案有相同的声明,你需要对列操作的别名进行查询,所以如果你想在条件语句中使用别名,你必须使用 HAVING 所以它的作品,其他方式你必须在 SELECT 和 WHERE 的地方使用你的concat操作。