WHERE转换列名称等于

时间:2011-07-22 04:50:54

标签: sql database filter conditional-statements where

是否可以编写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'

2 个答案:

答案 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语句中引用列别名不是严格可行的。解决此问题的常见方法是将整个语句包装在子查询中。唯一的问题是,您将遇到性能损失。这样做的原因是你将返回所有行,然后在检索之前删除一些而不是消除。