将值移动到下一列

时间:2014-03-24 14:15:21

标签: sql tsql

我有一张桌子(结构是固定的),其中包含24个字段H0-H23,表示一天中的小时数。在其中一列中会有一个'M'。一旦找到'M'(在H13中说),那么我想将H13中的值换成H14中的值(它旁边的字段)并将H14中的值换成H13。所以在这个例子中(为了清楚起见,我将它限制在6个字段)

Null,Null,T,T,M,S,F

会改为

Null,Null,T,T,S,M,F

最有效的方法是什么?谢谢

注意:我理解更新查询,主要问题是我需要找到'M'的位置,如果可能的话,不要做24个案例陈述

1 个答案:

答案 0 :(得分:0)

由于您无法更改数据结构,因此您仍然坚持使用大量CASE语句......

UPDATE
  yourTable
SET
  H00 = CASE m_hour                  WHEN 00 THEN H01 ELSE H00 END,
  H01 = CASE m_hour WHEN 00 THEN H00 WHEN 01 THEN H02 ELSE H01 END,
  H02 = CASE m_hour WHEN 01 THEN H01 WHEN 02 THEN H03 ELSE H02 END,
  H03 = CASE m_hour WHEN 02 THEN H02 WHEN 03 THEN H04 ELSE H03 END,
  ...
  H23 = CASE m_hour WHEN 22 THEN H22 WHEN 23 THEN ??? ELSE H23 END
FROM
(
  SELECT
    primary_key,
    CASE WHEN H00 = 'M' THEN 00
         WHEN H01 = 'M' THEN 01
         ...
    END AS m_hour
  FROM
    yourTable
)
  AS lookup
WHERE
  lookup.primary_key = yourTable.primary_key


您可以通过执行以下操作来缩短子查询CASE:

CHARINDEX('M', H00 + H01 + H02 + ... + H23, 0) - 1   AS m_hour

但是这也会增加一些CPU负载作为缩短代码的代价,并且不会在UPDATE中删除24个CASE语句。