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 に答える