如何在where子句中使用别名?

问题描述 投票:2回答:3

我正在尝试搜索多列文本和备忘录,以查找我不想看到的某些短语和黑名单短语。

假设下表

stories: 
id, title, author, publisher, content

防爆。我想找到所有提及(在任何领域)'苹果'但黑名单'苹果酱'的故事。

SELECT stories.id, [stories.title] & " " & [stories.author] & " " & [stories.publisher] & " " & [stories.memo] AS allMyText
FROM stories
WHERE ((([allMyText]) Like "*apples*" And ([allMyText]) Not Like "*applesauce*"));

如何在where子句中使用别名?我找不到关于这个主题的任何文件:

1)这种方法可行吗? 2)替代方法是否意味着我将在每次迭代中执行多个字符串连接?

sql ms-access vba jet
3个回答
4
投票

我不能在where子句中使用我的别名。

1.这种方法可行吗?

当然,把它放在子查询中。

SELECT *
FROM
(
SELECT stories.id, [stories.title] & " " & [stories.author] & " " & [stories.publisher] & " " & [stories.memo] AS allMyText
FROM stories
) AS SUBQ
WHERE ((([allMyText]) Like "*apples*" And ([allMyText]) Not Like "*applesauce*"));

2.不会替代意味着我会在每次迭代中执行多个字符串连接吗?

是的,这是正确的,另一种方法是重复表达。我不会厌倦你这个替代方案的代码。

对于您的特定查询,您也可以使用它

SELECT stories.id, [stories.title] & " " & [stories.author] & " " & [stories.publisher] & " " & [stories.memo] AS allMyText
FROM stories
WHERE ([stories.title] Like "*apples*" OR [stories.author] Like "*apples*" 
  OR [stories.publisher] Like "*apples*" OR [stories.memo] Like "*apples*")
AND NOT ([stories.title] Like "*applesauce*" OR [stories.author] Like "*applesauce*"
  OR [stories.publisher] Like "*applesauce*" OR [stories.memo] Like "*applesauce*")

3
投票

唯一的问题是,无论我尝试做什么,我都不能在where子句中使用我的别名。我找不到关于这个主题的任何文件

是的,Access / Jet / ACE'SQL'语言的文档严重缺乏,可用的少量文档存在令人震惊的错误。

这里有一些关于SQL的文档:

“Joe Celko在集合中的思考:SQL中的辅助,时间和虚拟表”,第12章,第235-237页:

以下是SELECT在SQL中的工作原理...从FROM子句开始...转到WHERE子句...转到可选的GROUP BY子句...转到可选的HAVING子句...转到SELECT子句并在列表中构造表达式。这意味着SELECT中的标量子查询,函数调用和表达式在完成所有其他子句之后完成。 AS运算符也可以为SELECT list中的表达式命名。这些新名称同时存在,但在WHERE条款之后,GROUP BY子句和HAVING条款已经执行;由于这个原因,你不能在SELECT列表或WHERE子句中使用它们。

我认为这解释了为什么你不能在Access(Jet,ACE,等等)的as clause子句中使用WHERE(“列别名”)。

也就是说,请注意Access不符合SQL,因为它允许您在从左到右的方向上使用as clause子句中的SELECT,例如这在Access SQL中是合法的(但在标准SQL中是非法的):

SELECT 2 AS a, 2 AS b, a + b AS c
  FROM tblMyTable

1
投票

使用子查询:

Select id,allMyText 
from
(SELECT stories.id, 
[stories.title] & " " & [stories.author] & " " 
& [stories.publisher] & " " & [stories.memo] AS allMyText
FROM stories ) as w
WHERE ((([allMyText]) Like "*apples*" And ([allMyText]) Not Like "*applesauce*"))
© www.soinside.com 2019 - 2024. All rights reserved.