2014-03-25 85 views
0

我想在select語句(SQL Server 2008)中使用變量,並且遇到一些困難。我已經在下面包含了我的代碼。在case語句中,在select語句中使用變量

DECLARE @newFieldName nvarchar(30) 

SET @newFieldName = 'Variable 1' 

SELECT 

SUM(CASE WHEN @newFieldName IN ('x', 'y' ,'z') then 1 ELSE 0 END) as "Default", 

SUM(CASE WHEN @newFieldName NOT IN ('x', 'y' ,'z') then 1 ELSE 0 END) as "Not Default" 

FROM table 1 

我沒有得到正確的結果。但是,當我使用下面,我做到了。

SELECT 

SUM(CASE WHEN [Variable 1] IN ('x', 'y' ,'z') then 1 ELSE 0 END) as "Default", 

SUM(CASE WHEN [Variable 1] NOT IN ('x', 'y' ,'z') then 1 ELSE 0 END) as "Not Default" 

FROM [table 1] 

任何幫助將不勝感激。謝謝。

回答

3

你的問題是什麼?表達:

'Variable 1' IN ('x', 'y' ,'z') 

總是會因爲你沒有包含在接受值列表中的字符串'Variable 1'返回FALSE。

表達:當變量包含這三個值中的一個

[Variable 1] IN ('x', 'y' ,'z') 

將返回TRUE。

一個常量字符串和一個列的名字是兩個非常不同的東西。如果您希望擁有代碼,您可以在其中使用變量更改列的名稱,則需要了解動態SQL和sp_executesql

編輯:

的你在做什麼的動態SQL版本是:

declare @sql nvarchar(max); 
declare @newFieldName nvarchar(30); 
set @newFieldName = 'Variable 1'; 

set @sql = ' 
SELECT SUM(CASE WHEN @newFieldName IN ('x', 'y' ,'z') then 1 ELSE 0 END) as "Default", 
     SUM(CASE WHEN @newFieldName NOT IN ('x', 'y' ,'z') then 1 ELSE 0 END) as "Not Default" 
FROM table 1'; 

set @sql = replace(@sql, '@newFieldName', '['[email protected]+']'); 

exec sp_executesql @sql; 

但是,你應該閱讀sp_executesql的文檔(here)和學習有關動態SQL開始。

+0

感謝@Gordon Linoff。我的問題是如何使用DECLARE/SET來聲明[Variable 1]?這可能是一個更復雜的任務。 – user3022742

0

你@newFieldName只是一個字符串:它不「冒充」,在表中的實際列...

我認爲既然你可能只有你有興趣,你列的福可以這樣做

DECLARE @newFieldName nvarchar(30) 

SET @newFieldName = 'Variable 1' 

SELECT 
SUM(CASE WHEN @newFieldName = 'Variable 1' and [Variable 1] IN ('x', 'y' ,'z') then 1 
     WHEN @newFieldName = 'Variable 2' and [Variable 2] IN ('x', 'y' ,'z') then 1 ELSE 0 
    END) as [Default], 
SUM(CASE WHEN @newFieldName = 'Variable 1' and [Variable 1] NOT IN ('x', 'y' ,'z') then 1 
    WHEN @newFieldName = 'Variable 2' and [Variable 2] NOT IN ('x', 'y' ,'z') then 1 ELSE 0 
END) as [Not Default], 

FROM table 1 

這樣你可以避免動態SQL,但當然會變得醜陋很快與多個列的可能性

+0

我有很多列。這個SELECT語句實際上是坐在一個循環中。我從列名稱的表中讀取newFieldName。不過謝謝。 – user3022742