我有一张桌子(结构是固定的),其中包含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个案例陈述
答案 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语句。