1

我在这里试图实现的是传递一个星期几参数,该参数保存当前日期(星期三等)的值,并将其与列名进行比较以确定在 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但我认为这不是我需要的。

4

3 回答 3

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
);
于 2013-02-13T16:00:09.643 回答
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;
于 2013-02-13T15:57:02.070 回答
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'
于 2013-02-13T15:55:56.020 回答