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

时间:2011-02-04 02:17:36

标签: sql ms-access vba jet

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

假设下表

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)替代方法是否意味着我将在每次迭代时执行多个字符串连接?

3 个答案:

答案 0 :(得分: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*")

答案 1 :(得分: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

答案 2 :(得分: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*"))