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

Posted

技术标签:

【中文标题】如何在 where 子句中使用我的别名?【英文标题】:How do I use my alias in the where clause? 【发布时间】:2011-02-04 02:17:36 【问题描述】:

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

假设如下表

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*"));

我找不到有关该主题的任何文档:

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

【问题讨论】:

【参考方案1】:

我不能在 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*")

【讨论】:

在我看来,子查询方法实际上并没有那么有用——它过度设计了解决问题的方法。顺便说一句,如果人们只是将 Access 查询生成器用于此类事情,他们将避免此类问题(它将生成正确的 Jet/ACE 兼容 SQL)。 @David-W-Fenton:OP 已经接受了这个答案,所以由你来定义“真的不会那么有帮助”的意思。另外,我想看看你的“解决方案”,以便我们评估它的“过度工程”。 我会选择你的第二个解决方案。这只是我认为没有用的第一个。【参考方案2】:

唯一的问题是,不管 我尝试做什么,我不能使用我的别名 在 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 等)的 WHERE 子句中使用 as clause(“列别名”)。

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

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

【讨论】:

虽然不是“答案”,但您确实帮助我更深入地理解了这个问题!非常感谢您的周到回复! 如果 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 产品将完全兼容 SQL-92,因为它包含没人想要的特性 (UNION JOIN') or that are not practical to implement (CREATE ASSERTION`)。但我猜你也同样轻率。 @CPerkins:公平地说,我不认为 Access 声称支持 SQL。我的观点是:如果您不能查阅/信任 Access 文档,因为它不存在/包含错误,并且您不能查阅标准 SQL 文本,因为它不适用于 Access 的 SQL 版本,那么它是一个产品吗?人们应该将其用于业务关键型应用程序?【参考方案3】:

使用子查询:

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 子句中使用我的别名?的主要内容,如果未能解决你的问题,请参考以下文章

在 WHERE 子句 SQL 中使用别名 [重复]

如何在 MySQL LEFT JOIN 中使用别名

在 WHERE 子句中使用别名

在 WHERE 或 GROUP BY 子句中使用列表别名

在 MySQL 查询的 WHERE 子句中使用列别名会产生错误

SQL语句中,子句不能使用列别名问题