我在这里想要实现的是传递一周中的一天参数,该参数保存当前日期的值(星期三等),并将其与列名称进行比较以确定要在哪个列中使用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
,但我认为这不是我需要的。
答案 0 :(得分:5)
由于您的数据未规范化,您可以使用UNPIVOT
函数将数据放入行中,以便于查询:
select col, value
from DayTable
unpivot
(
value
for col in ([Sunday], [Monday], [Tuesday], [Wednesday],
[Thursday], [Friday], [Saturday])
) unpiv
where col = @DayOfWeek
解决问题的最佳方法是将表格重新设计为:
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'