0

大家好,这是我第一次参加这样的论坛。我来自德国,所以英语不是我的母语,所以请不要对我太苛刻:)。

Select top(1) firstname+' '+lastname AS APName 
From ansprech 
Where customernr = 10205 and APName LIKE '%Max Example';

我想使用我在此 Like 语句中创建的别名。我已经搜索了将近一个小时,但我找不到我的问题的正确答案,所以也许你们可以帮助我:)。

4

5 回答 5

1

您可以使用subquery

SELECT * FROM 
(Select firstname+' '+lastname AS APName From ansprech Where customernr = 10205 ) TMP WHERE APName LIKE '%Max Example';

或者

Select top(1) firstname+' '+lastname AS APName From ansprech Where (customernr = 10205) and ( firstname+' '+lastname LIKE '%Max Example');
于 2020-05-12T07:12:33.417 回答
1

在 SQL Server(和 Access)上,除了使用子查询或只是重复完整的别名表达式之外,您别无选择。在这种情况下,我会选择后者:

SELECT TOP(1)
    firstname + ' ' + lastname AS APName
FROM ansprech
WHERE customernr = 10205 AND firstname + ' ' + lastname LIKE '%Max Example';
于 2020-05-12T07:18:34.883 回答
0

当您运行 SELECT 查询时,SQL Server 遵循以下处理顺序。阅读更多关于 SELECT 查询的处理顺序

SELECT语句的逻辑处理顺序

以下步骤显示了 SELECT 语句的逻辑处理顺序或绑定顺序。此顺序确定一个步骤中定义的对象何时可用于后续步骤中的子句。例如,如果查询处理器可以绑定(访问)在 FROM 子句中定义的表或视图,则这些对象及其列可用于所有后续步骤。相反,因为 SELECT 子句是第 8 步,所以在该子句中定义的任何列别名或派生列都不能被前面的子句引用。但是,它们可以被后续子句引用,例如 ORDER BY 子句。语句的实际物理执行由查询处理器确定,并且顺序可能与此列表不同。

  1. 加入
  2. 在哪里
  3. 通过...分组
  4. WITH CUBE 或 WITH ROLLUP
  5. 拥有
  6. 选择
  7. 清楚的
  8. 订购方式
  9. 最佳

您的别名即将进入 SELECT 阶段 8,因此不能在前面的阶段 4(WHERE 子句)中引用它。如果要在 WHERE 子句中引用别名,则别名应该是 FROM 子句(第 1 阶段)的一部分,它位于 WHERE 子句(第 4 阶段)之前。您可以做的是,在 FROM 子句中有一个子查询来获取别名作为结果的一部分,然后在 WHERE 子句中使用它。

SELECT top(1) APName
FROM (SELECT firstname+' '+lastname AS APName, CustomerNr From ansprech) AS c 
WHERE customernr = 10205 and APName LIKE '%Max Example';
于 2020-05-12T07:29:09.327 回答
0

我更喜欢用来APPLY模拟类似变量的行为:

USE master;

SELECT NewAlias
FROM [sys].[objects] o
CROSS APPLY(SELECT CONCAT(o.[name],' (',o.[object_id],')') AS NewAlias) A --A ist just an alias for the APPLY's result
WHERE NewAlias LIKE '%cols%';

APPLY 是按调用。如果引擎可以确定这将只返回一行,那么它的执行速度非常快。您可以将其视为附加的计算列

于 2020-05-12T08:45:47.207 回答
0

和 Shnugo 一样,我非常喜欢在FROM子句中定义标识符。对于您的查询,这看起来像:

select top(1) v.APName 
from ansprech a cross apply
     (values (a.firstname + ' ' + a.lastname)) v(APName)
where a.customernr = 10205 and
      v.APName like '%Max Example';
于 2020-05-12T11:46:52.500 回答