【问题标题】:WHERE cast column name equalsWHERE 强制转换列名等于
【发布时间】:2011-10-10 18:38:36
【问题描述】:

是否可以编写使用已分配给列的列名而不是实际存在的列名的 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'

【问题讨论】:

  • 你真的试过了吗?
  • @Chris - 我不是 OP,但我不确定你在这里要求什么。您是在询问 OP 是否上述方法确实不起作用?如果是这样,答案是肯定的,它不起作用。
  • 我的意思是插入它并尝试运行它会更快。
  • 我当然试过了。这个例子只是为了展示思考过程。如果你只写一个段落,有些人似乎不明白,但如果你添加一些代码来显示你正在尝试做的事情,它就会变得更加明显。

标签: sql database filter conditional-statements where


【解决方案1】:

使您的原始查询成为子查询:

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'

【讨论】:

    【解决方案2】:

    Keith 的回答是正确的,但我会解释原因。您不能在 WHERE 子句中引用列别名。其原因是基于系统处理命令的顺序。我们看这个命令,从上往下读。但是,数据库引擎将其视为一组语句。它首先读取您的 FROM 语句以确定要访问的表。然后它会读取您的 WHERE 语句以找出要包含/排除的数据。最后,它会查看您的 SELECT 语句以确定要显示的数据。

    由于按此顺序评估整个语句,因此 WHERE 语句无权访问在 SELECT 语句中创建的别名,因为这些别名尚未处理。因此,严格来说不可能在 WHERE 语句中引用列别名。解决此问题的常用方法是将整个语句包装在子查询中。唯一的问题是你会遇到性能下降。这样做的原因是您将返回所有行,然后消除一些行,而不是在检索之前进行消除。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-16
      • 1970-01-01
      • 1970-01-01
      • 2012-07-06
      • 2012-07-06
      • 1970-01-01
      相关资源
      最近更新 更多