SELECT中的列在WHERE中是“未定义的”

时间:2009-11-11 15:09:00

标签: sql

我有一个问题:

SELECT exhibitor_participation+0 AS exhibitor_participation_value 
FROM `exhibitor_registry` 
WHERE ((exhibitor_participation_value & 1) = 1)

问题:

为什么会这样:?

Unknown column 'exhibitor_participation_value' in 'where clause'

因为我在SELECT子句中定义了exhibitor_participation_value,所以它不应该成功吗?

3 个答案:

答案 0 :(得分:3)

这可能取决于您的数据库,但通常没有。 select子句中定义的列别名在where子句中不可用。

答案 1 :(得分:1)

where子句正在数据集的原始列上运行。 同一级别的select子句在同一个操作上运行,并且可以选择为外层代码提供别名。但关键的是,别名“包装”当前级别并且在那里不可用 - 具体来说,你不能在where子句中使用别名。

可以做过这样的事情:

SELECT *
FROM
    (SELECT exhibitor_participation+0 AS exhibitor_participation_value
     FROM `exhibitor_registry`)
WHERE ((exhibitor_participation_value & 1) = 1)

并且别名可以在where子句中使用,因为它现在是在该级别选择的列之一的名称。将选择向下推入内部视图可能限制数据库提出适当查询计划的能力(通常将取决于许多因素并在每个单独查询之间变化)。另一方面,如果where条件需要花费不可忽略的时间来计算,实际上可以通过在内部视图中计算一次来节省时间,而不是两次(同样,优化器可以在这里重用第一个值 - 它取决于)。

与所有与效果相关的问题一样,请查看您特定情况下实际需要的内容。

答案 2 :(得分:0)

不使用您为该列指定的别名,只需使用实际的列名称,或者在这种情况下:

SELECT exhibitor_participation+0 AS exhibitor_participation_value 
FROM `exhibitor_registry` 
WHERE ((exhibitor_participation +0 & 1) = 1)