【问题标题】:Using Aliases in Where Clause or an Alternative Option?在 Where 子句或替代选项中使用别名?
【发布时间】:2011-12-04 01:31:45
【问题描述】:

我如何让它工作,它在没有 Where 子句的情况下工作,否则使用 Where 子句,我得到明显的错误,但这基本上是需要做的,有人知道如何解决这个问题吗?

select ID, 
       Name,
       case T.N 
         when 1 then City1
         when 2 then City2
         when 3 then City3
       end as City,
       case T.N 
         when 1 then State1
         when 2 then State2
         when 3 then State3
       end as State
from YourTable
  cross join (values(1),(2),(3)) as T(N)

    Where City is NOT Null

【问题讨论】:

  • 希望此查询的目的是让您可以修复表结构并将其放入第一范式。

标签: tsql sql-server-2008


【解决方案1】:

您不能在WHERE 子句中使用别名(来自SELECT 子句),因为logical processing order(部分:Logical Processing Order of the SELECT statement)是WHERE,然后是SELECT

FROM    
ON
JOIN
WHERE <--
GROUP BY
WITH CUBE or WITH ROLLUP
HAVING
SELECT <--
DISTINCT
ORDER BY <--
TOP

但是,您可以在 ORDER BY 中使用别名:

SELECT  h.SalesOrderID, YEAR(h.OrderDate) OrderYear
FROM    Sales.SalesOrderHeader h
ORDER BY OrderYear;

解决方案:查看 Mark Byers 提出的解决方案。

Tibor Karaszi: Why can't we have column alias in ORDER BY?

【讨论】:

    【解决方案2】:

    您不能在 WHERE 子句中使用别名。要么重复表达式(混乱),要么将您的 SELECT 放在子查询中,然后将 WHERE 子句放在外部查询中:

    SELECT Id, Name, City, State
    FROM
    (
         SELECT
             ID, 
             Name,
             CASE T.N 
                 WHEN 1 THEN City1
                 WHEN 2 THEN City2
                 WHEN 3 THEN City3
             END AS City,
             CASE T.N 
                 WHEN 1 THEN State1
                 WHEN 2 THEN State2
                 WHEN 3 THEN State3
             END AS State
         FROM YourTable
         CROSS JOIN (VALUES(1),(2),(3)) AS T(N)
    ) T1
    WHERE City IS NOT NULL
    

    【讨论】:

      猜你喜欢
      • 2010-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-20
      • 1970-01-01
      • 2011-03-15
      • 2020-05-14
      相关资源
      最近更新 更多