2014-01-07 26 views
0

我有一個3列的表:Id,Price,Total。 我在寫這條SQL語句:SQL - WHERE在新列

SELECT Id, Price, Total, 
CASE WHEN [Total] IS NULL THEN '0' 
    WHEN [Total] IS NOT NULL '1' 
    ELSE '' 
END AS NewColumnName 
FROM Table 

如果我運行這個SQL,我沒有任何錯誤。但是,如果我添加一個Where,如下所示: WHERE NewColumnName ='1'服務器返回一個錯誤:列NewColumnName的名稱無效。

請幫幫我! 非常感謝! RM

+0

順便說一句 - CASE語句中的第二個WHEN和ELSE部分有點r edundant。值是'null'或不是,沒有第三個選項。所以'CASE'語句可以簡化爲'CASE WHEN [Total] IS NULL THEN'0'ELSE'1'END' – Mureinik

回答

2

你可以試試這種方式嗎?

select * 
from (
    SELECT Id, Price, Total, 
    CASE WHEN [Total] IS NULL THEN '0' 
     WHEN [Total] IS NOT NULL '1' 
     ELSE '' 
    END AS NewColumnName 
    FROM Table 
) x 
where 
    NewColumnName= '1' 
+0

我確定'ELSE'是浪費打字和處理器週期。 – Jodrell

+0

你說得對。我假設原始查詢只是一個例子。我計劃不要改變它。 –

+0

我想它更多的評論爲OP @ user2657115 – Jodrell

0

您不能在WHERE子句中使用NewColumnName。您將不得不在WHERE子句中再次使用CASE語句,或者執行@Lajos建議的操作。

1

試試這個,

SELECT Id, Price, Total, 
CASE WHEN [Total] IS NULL THEN '0' 
    WHEN [Total] IS NOT NULL '1' 
END AS NewColumnName 
FROM Table 
WHERE CASE WHEN [Total] IS NULL THEN '0' 
    WHEN [Total] IS NOT NULL '1' 
END = '1' 
+0

爲什麼不只是'WHERE [總]不是空' – Jodrell

+0

@Jodrell - 當然!甚至更好:) – hashbrown

0

你可以只寫你的查詢是這樣的:

SELECT Id, Price, Total, 
FROM Table 
WHERE Total IS NOT NULL 

這是做同樣的事情,只是沒有case語句。

1

一般使用子查詢,

SELECT Id, Price, Total, NewColumnName 
    FROM ( 
     SELECT 
        Id, 
        Price, 
        Total, 
        CASE 
         WHEN [Total] IS NULL THEN '0' 
         ELSE '1' 
        END [NewColumnName] 
      FROM 
        Table) [WithNew] 
    WHERE 
     NewColumnName = '1'; 

或你的情況,你可以做,

SELECT 
      Id, 
      Price, 
      Total, 
      1 [NewColumnName] 
    FROM 
      Table 
    WHERE 
      Total IS NOT NULL; 
1
USE [AdventureWorks2012] 

WITH cte as (
SELECT [AddressID], [AddressLine1] 
     , CASE WHEN [City] = 'Bothell' THEN 1 ELSE 0 END AS [NewColumn] 
FROM Person.Address) 

SELECT * FROM CTE 
WHERE [NewColumn] = 1 

所以你纔可以重新寫成這樣:

WITH cte as (
SELECT Id, Price, Total, 
CASE WHEN [Total] IS NULL THEN '0' 
    WHEN [Total] IS NOT NULL '1' 
    ELSE '' 
END AS NewColumnName 
FROM Table) 

SELECT * FROM CTE where [NewColumnName] = 1