Sql 在where子句中如何使用别名?
我试图在文本和备忘录的多个栏中搜索我不想看到的某些短语和黑名单短语 假设下表Sql 在where子句中如何使用别名?,sql,ms-access,vba,jet,Sql,Ms Access,Vba,Jet,我试图在文本和备忘录的多个栏中搜索我不想看到的某些短语和黑名单短语 假设下表 stories: id, title, author, publisher, content 我想找到所有提到(在任何领域)“苹果”但却被列入黑名单“苹果酱”的故事 SELECT stories.id, [stories.title] & " " & [stories.author] & " " & [stories.publisher] & " " & [stori
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*")
使用子查询:
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*"))
唯一的问题是,不管
我想做的是,我不能使用我的别名
在where子句中。我找不到
关于该主题的文件
是的,Access/Jet/ACE“SQL”语言的文档严重缺乏,可用的文档很少,存在令人震惊的错误
下面是一些关于SQL的文档:
“Joe Celko的集合思维:SQL中的辅助表、时态表和虚拟表”,ch12,pp235-237:
下面是一个SELECT
如何在SQL中工作。。。
从FROM
子句开始。。。去
WHERE
子句。。。去医院
可选的分组依据
子句。。。去
可选的HAVING
子句。。。去
SELECT
子句并构造
列表中的表达式。这意味着
标量子查询,函数
在选择中调用和表达式
在所有其他条款之后完成
完成了。AS
操作员也可以
给表中的表达式命名
选择列表
。这些新名字出现了
一下子就存在了,但之后
WHERE
子句、groupby
子句
并且,已经有了
子句
执行;您不能在应用程序中使用它们
选择
列表或WHERE
子句
因为这个原因
我认为这就解释了为什么不能在Access(Jet、ACE等)中的WHERE
子句中使用as子句(“列别名”)
尽管如此,请注意Access与SQL不兼容,因为它允许您在SELECT
子句中从左到右使用as子句,例如,这在Access SQL中是合法的(但在标准SQL中是非法的):
虽然不是“答案”,但你确实帮助我更深入地理解了这个问题!非常感谢您周到的回复!如果Access SQL不是“SQL”,那么SQL一定是一个毫无意义的名字,因为没有其他SQL实现符合ANSI标准的每个细节。即使有一个完美的实现,也可能只针对特定的版本,不同的版本允许不同的实现。因此,简单地引用“SQL”是毫无意义的,除非它包含完整的标准版本引用。因此,我们可以由此“证明”所有声称支持SQL的产品实际上都不支持。@CPerkins:“不是SQL”的说法只是我的轻率。我已经删除了它。@CPerkins:FWIW我认为“Is SQL”的一个好基准是入门级SQL-92。Access SQL不符合此标准,而所有其他流行产品(SQL Server、DB2、Oracle、Postgres、mySQL等)都符合此标准。没有任何SQL产品是完全符合SQL-92的,也永远不会是完全符合SQL-92的,因为它包含了没有人想要的(UNION-JOIN')或不实用的(
CREATE-ASSERTION')功能。但我猜你也同样轻率。@CPerkins:公平地说,我不认为Access声称支持SQL。我的观点是:如果你不能查阅/信任Access文档,因为它不存在/包含错误,你不能查阅标准SQL文本,因为它不适用于Access版本的SQL,那么它是人们应该用于业务关键型应用程序的产品吗?子查询方法真的没有那么大的帮助,在我看来,这是对问题解决方案的过度设计。顺便说一句,如果人们只是简单地使用Access查询生成器来处理这类问题,他们就会避免这类问题(它将生成正确的Jet/ACE兼容SQL)。@David-W-Fenton:OP已经接受了这个答案,所以现在轮到你来定义你所说的“真的没有那么大帮助”的意思了。另外,我想看看你的“解决方案”,这样我们就可以评估它的“过度工程”性。我会选择你的第二个解决方案。这只是我不认为有用的第一个。
SELECT 2 AS a, 2 AS b, a + b AS c
FROM tblMyTable