"列名无效"(在where子句中使用别名)

Tad*_*dej 1 sql sql-server sql-server-2008

我从我的SQL Server收到此错误消息:

列名称'价格'无效

在Microsoft SQL Server Management Studio中.

我的SQL语句:

SELECT
    CASE
       WHEN salePriceDate BETWEEN salePriceStartDate AND salePriceEndDate
          THEN salePrice
          ELSE 
             CASE
                WHEN salePriceDate2 BETWEEN salePriceStartDate2 AND salePriceEndDate2
                   THEN salePrice2
                   ELSE normalPrice
             END
    END AS price
FROM 
    prices
WHERE 
    price BETWEEN 1 AND 100
Run Code Online (Sandbox Code Playgroud)

我怎么解决这个问题?

Gor*_*off 5

SQL不允许使用在定义的别名SELECT将在WHERE条款(或大多数其他条款).这是SQL语言的一部分.

有多种方法可以解决这个问题.一种方法是子查询.另一个是CTE.SQL Server还提供横向连接:

SELECT p.*, v.price
FROM prices p OUTER APPLY
     (VALUES (CASE WHEN p.salePriceDate BETWEEN p.salePriceStartDate AND p.salePriceEndDate
                   THEN p.salePrice
                   WHEN p.salePriceDate2 BETWEEN p.salePriceStartDate2 p.AND salePriceEndDate2
                   THEN p.salePrice2
                   ELSE p.normalPrice
              END)
     ) v(price)
WHERE v.price BETWEEN 1 AND 100;
Run Code Online (Sandbox Code Playgroud)

另请注意,这简化了CASE表达式.没有必要筑巢CASE.