2013-02-13 93 views
1

我在這裏想要實現的是在星期幾參數中傳遞參數,該參數保存當天(星期三等)的值,並將其與列名進行比較以確定在列中使用哪一列where子句。如何使用列名與SQL中的參數進行比較?

因此,星期天 - 星期六有專欄。在where子句中,我想將這些列名與我傳入的參數進行比較,並僅將匹配值拉回。

說見下表被稱爲DayTable

Sunday Monday Tuesday Wednesday Thursday Friday Saturday 
    1  1  1  1  1  1  0 
    1  1  1  1  1  1  1 


SELECT * 
FROM DayTable 
WHERE ColumnName = @DayOfWeek 

這是我想達到如果甚至有可能是什麼。我在看ColumnProperty,但我不認爲這就是我需要的。

+0

試圖排隊1和0,但格式失敗笑,只是圖片2行,與那些價值觀和是正在使用的數據。 – user1732364 2013-02-13 15:47:52

+0

哈哈好吧,我不認爲這是像我希望的那麼簡單。我只是重構表格來簡化它。 – user1732364 2013-02-13 15:52:22

+0

您的預期輸出是什麼? – GarethD 2013-02-13 15:56:19

回答

4
SELECT 
    CASE @DayOfWeek 
     WHEN 'Sunday' THEN Sunday 
     WHEN 'Monday' THEN Monday 
     WHEN 'Tuesday' THEN Tuesday 
     WHEN 'Wednesday' THEN Wednesday 
     WHEN 'Thursday' THEN Thursday 
     WHEN 'Friday' THEN Friday 
     WHEN 'Saturday' THEN Saturday 
    END AS TodaysValue 
FROM 
    DayTable; 
+0

+ 1的最佳性能(略),但我希望你不介意我修正了語法。 – 2013-02-13 16:09:02

+0

@TimLehner你沒有「修復」語法,你改變了它!兩者同樣有效。 :-) – Tobsey 2013-02-13 16:16:21

+0

啊,是的,我確實改變了簡單的形式,儘管之前有太多的'case'聲明。 – 2013-02-13 16:23:25

1

可能動態構建必需的SQL並使用sp_executesql執行它。

請注意,以下在@ sql應該沒有空間,但我的愚蠢的工作代理不會發布。

DECLARE @sql NVARCHAR(1000) 
SET @sql = N'SELECT * FROM DayTable WHERE ' + @DayOfWeek + ' = ' + @value 
sp_executesql @sql 

但是,我不認爲你發佈的SQL是正確的。我想你想只選擇合適的

DECLARE @sql NVARCHAR(1000) 
SET @sql = N'SELECT ' + @DayOfWeek + ' FROM DayTable' 
sp_executesql @sql 

不過,我建議你的數據庫設計不理想 - 這將是更簡單的轉動這個表像

Day  Value1  Value2 
Monday  1   1 
Tuesday 1   1 
Wednesday 1   1 
Thursday 1   1 
Friday  1   1 
Saturday 1   0 
Sunday  1   1 

然後你可以簡單地做

SELECT Value1, Value2 
FROM DayTable 
WHERE Day = 'Thursday' 
+0

標準化的樞軸表是最好的解決方案 – Tobsey 2013-02-13 15:59:28

5

由於您的數據不歸,你可以可以使用UNPIVOT功能,讓您的數據轉化爲行這使得它很容易地查詢:

select col, value 
from DayTable 
unpivot 
(
    value 
    for col in ([Sunday], [Monday], [Tuesday], [Wednesday], 
       [Thursday], [Friday], [Saturday]) 
) unpiv 
where col = @DayOfWeek 

SQL Fiddle with Demo

您的問題最好的解決辦法是你的表重新設計的東西是這樣的:

create table DayTable 
(
    DayName varchar(20), 
    Value int 
); 
相關問題