我知道在oracle / mysql /
sqlserverselect
语句中,您不能在where
子句中引用列别名,因为它是在之前执行的select
,但它在sqlite3中有效:
sqlite> create table t (c1 text, c2 text);
sqlite> insert into t values ("a1", "a2");
sqlite> insert into t values ("b1", "b2");
sqlite> select c1, c2 from t;
a1|a2
b1|b2
sqlite> select c1, c2 as alias_c2 from t where alias_c2='b2';
b1|b2
为什么在sqlite中这有可能?
使用SQLITE_DEBUG
启用了标志的sqlite3 :
sqlite> create table x (x1 integer);
sqlite> insert into x values (1);
sqlite> insert into x values (2);
sqlite> insert into x values (3);
sqlite> insert into x values (4);
sqlite> insert into x values (5);
sqlite> pragma vdbe_listing=1;
VDBE Program Listing:
0 Expire 0 0 0 00
1 Halt 0 0 0 00
sqlite> select x1*x1 as s from x where s>-10 and s>-9 and s>0 and s>-4 and s>2;
VDBE Program Listing:
0 Trace 0 0 0 00
1 Integer -10 1 0 00
2 Integer -9 2 0 00
3 Integer 0 3 0 00
4 Integer -4 4 0 00
5 Integer 2 5 0 00
6 Goto 0 26 0 00
7 OpenRead 0 3 0 1 00 x
8 Rewind 0 24 0 00
9 Column 0 0 7 00 x.x1
10 Multiply 7 7 6 00
11 Le 1 23 6 6A
12 Multiply 7 7 6 00
13 Le 2 23 6 6A
14 Multiply 7 7 6 00
15 Le 3 23 6 6A
16 Multiply 7 7 6 00
17 Le 4 23 6 6A
18 Multiply 7 7 6 00
19 Le 5 23 6 6A
20 Column 0 0 6 00 x.x1
21 Multiply 6 6 9 00
22 ResultRow 9 1 0 00
23 Next 0 9 0 01
24 Close 0 0 0 00
25 Halt 0 0 0 00
26 Transaction 0 0 0 00
27 VerifyCookie 0 4 0 00
28 TableLock 0 3 0 x 00
29 Goto 0 7 0 00
s
----
4
9
16
25
sqlite>
从上面的指令堆栈可以看出,行的循环(第8-23行)针对表中的每一行对子句中的每个表达式重复执行Multiply
andLe
命令where
。
因此,要回答我自己的问题,sqlite引擎能够通过select
在执行时替换列的别名来使用列别名where
。
问题内容: 我懂了 “无效的列名daysdiff”。 Maxlogtm是日期时间字段。是让我发疯的小东西。 问题答案: 通常,您不能在子句中引用字段别名。(将其视为包括别名在内的全部内容,在该子句之后应用。) 但是,如其他答案所述,您可以强制将SQL视为在子句之前进行处理。通常使用圆括号来强制操作的逻辑顺序,或者使用通用表表达式(CTE)来完成此操作: 括号/子选择: 或参阅亚当的CTE版本答案。
问题内容: 我正在执行以下查询,并为所有列使用别名。我用命名了别名。因为这是必需的。现在,我想直接在where子句中引用别名,我的操作如下所示: 但是,当我执行此操作时,出现以下错误: 我知道SQL首先执行where子句,因此这就是错误的原因。但是我该如何解决呢?有什么建议吗? 问题答案: 您已经知道不能在子句中使用别名,但这仅适用于相同级别的SQL。您可以将查询包装在外部查询中: 唯一的选择是重
问题内容: 我正在尝试搜索文本和备注的多列,以查找某些我不想看到的特定短语和黑名单短语。 假设下表 前任。我想找到所有提到(在任何领域中)“苹果”但黑名单中的“苹果酱”的故事。 如何在where子句中使用别名?我找不到有关此主题的任何文档: 1)这种方法可行吗? 2)替代方法是否意味着我将在每次行迭代中执行多个字符串连接? 问题答案: 我不能在where子句中使用别名。 这种方法可行吗? 当然,将
问题内容: 我知道我可能需要进行分组才能完成此任务,但我不太了解。PostgreSQL 8.1 我需要将结果集限制为“原始> 2017-01-01”。原始设置在第11行中。它在Excel中作为一列返回,是一个日期。 目前,它返回的结果可以追溯到几年前的数据,而我们并不需要它。 更新:我已将选择内容更改为这样,它似乎正在工作-是否对这样做是否正确有任何想法?它只会一直盯着过去的180天。 问题答案:
问题内容: 我有这样的查询: 出现以下错误: 在MySql中,这是有效的,但显然在Postgresql中是无效的。据我所知,原因是查询部分的评估晚于该部分。是否有解决此问题的常用解决方法? 问题答案: 正如您所经历的那样,MySQL的支持是非标准的。正确的方法是重新打印SELECT子句中使用的相同表达式:
问题内容: 我需要在WHERE子句中使用别名,但它一直告诉我它的未知列。有什么办法可以解决这个问题?我需要选择评级高于x的记录。评分的计算方法如下: 问题答案: 您可以使用HAVING子句,该子句 可以 看到别名,例如 但是在where子句中,您需要重复您的表达式,例如 但!并非所有的表达式都被允许-使用像SUM这样的聚合函数将不起作用,在这种情况下,您将需要使用HAVING子句。 从MySQL手