是否可以编写where语句,该语句使用已分配给列的列名而不是实际存在的列名?整个表是动态创建的,列名存储在另一个表中。我有一个函数,允许用户在检索与其一起使用的数据集之前向作业添加过滤器。
我正在尝试的例子:
SELECT id,
col1 as [description],
col2 as [date1],
col3 as [image],
col4 as [date2],
col5 as [link],
col6 as [location],
col7 as [price],
col8 as [title]
FROM tableName
WHERE [title] = 'Lemons'
答案 0 :(得分:4)
将原始查询设为子查询:
SELECT *
FROM (
SELECT id,
col1 as [description],
col2 as [date1],
col3 as [image],
col4 as [date2],
col5 as [link],
col6 as [location],
col7 as [price],
col8 as [title]
FROM tableName
) as subquery
WHERE [title] = 'Lemons'
答案 1 :(得分:3)
基思的回答是正确的,但我将阐述原因。您不能在WHERE子句中引用列别名。其原因是基于系统处理命令的顺序。我们查看此命令并从上到下阅读。但是,数据库引擎会根据一组语句查看它。它首先读取您的FROM语句以确定要访问的表。然后,它会读取您的WHERE语句,以确定要包含/排除的数据。最后,它会查看SELECT语句以确定要显示的数据。
由于整个语句按此顺序计算,因此WHERE语句无权访问SELECT语句中创建的别名,因为尚未处理这些别名。因此,在WHERE语句中引用列别名不是严格可行的。解决此问题的常见方法是将整个语句包装在子查询中。唯一的问题是,您将遇到性能损失。这样做的原因是你将返回所有行,然后在检索之前删除一些而不是消除。