2013-02-13 90 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 
); 
相关问题