如何使用列名与SQL中的参数进行比较?

时间:2013-02-13 15:46:19

标签: sql sql-server-2008

我在这里想要实现的是传递一周中的一天参数,该参数保存当前日期的值(星期三等),并将其与列名称进行比较以确定要在哪个列中使用where子句。

所以在星期日 - 星期六采取列。在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,但我认为这不是我需要的。

3 个答案:

答案 0 :(得分: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
);

答案 1 :(得分: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;

答案 2 :(得分: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'