我正在尝试搜索多列文本和备忘录,以查找我不想看到的某些短语和黑名单短语。
假设下表
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)替代方法是否意味着我将在每次迭代中执行多个字符串连接?
我不能在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*")
唯一的问题是,无论我尝试做什么,我都不能在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
使用子查询:
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*"))