【发布时间】:2020-05-09 14:21:39
【问题描述】:
我想做一个 SQL 动态 SQL 更新语句,我将检查两个字段之间的所有组合,例如...
MS|TO 或 MS|1
...并更新受影响的。我可以从另一个表中选择所有组合。如何为每个组合使用 WHEN 括号创建动态 CASE 子句。
UPDATE dbo.KonfigTableOne
SET P01Dec = ( CASE
WHEN (Ap.Ke01 + '|' + Ap.Ke02 = '*|*') THEN (SELECT FACTOR FROM Factor WHERE SHORTCUT = '*|*')
WHEN (Ap.Ke01 + '|' + Ap.Ke02 = 'MS|*') THEN (SELECT FACTOR FROM Factor WHERE SHORTCUT = 'MS|*')
WHEN (Ap.Ke01 + '|' + Ap.Ke02 = 'ME|*') THEN (SELECT FACTOR FROM Factor WHERE SHORTCUT = 'ME|*')
WHEN (Ap.Ke01 + '|' + Ap.Ke02 = '*|1') THEN (SELECT FACTOR FROM Factor WHERE SHORTCUT = '*|1')
WHEN (Ap.Ke01 + '|' + Ap.Ke02 = '*|2') THEN (SELECT FACTOR FROM Factor WHERE SHORTCUT = '*|2')
WHEN (Ap.Ke01 + '|' + Ap.Ke02 = 'MS|1') THEN (SELECT FACTOR FROM Factor WHERE SHORTCUT = 'MS|1')
WHEN (Ap.Ke01 + '|' + Ap.Ke02 = 'MS|2') THEN (SELECT FACTOR FROM Factor WHERE SHORTCUT = 'MS|2')
WHEN (Ap.Ke01 + '|' + Ap.Ke02 = 'ME|1') THEN (SELECT FACTOR FROM Factor WHERE SHORTCUT = 'ME|1')
WHEN (Ap.Ke01 + '|' + Ap.Ke02 = 'ME|2') THEN (SELECT FACTOR FROM Factor WHERE SHORTCUT = 'ME|2')
END )
FROM dbo.KonfigTableOne AS Ap CROSS JOIN
dbo.KonfigTableTwo AS Ep
WHERE (Ap.P02Dec = 1)
【问题讨论】:
-
您使用的是哪个 dbms?
-
为什么不直接使用条件,完全去掉 CASE 呢?喜欢:
UPDATE dbo.KonfigTableOne SET P01Dec = (SELECT FACTOR FROM Factor WHERE SHORTCUT = Ap.Ke01 + '|' + Ap.Ke02)
标签: sql dynamic sql-update case combinations