【问题标题】:Update field by checking the combination of parameters通过检查参数组合来更新字段
【发布时间】: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


【解决方案1】:

您的查询可以简化为:

UPDATE ap
    SET P01Dec = (SELECT FACTOR FROM Factor  WHERE SHORTCUT = Ap.Ke01 + '|' + Ap.Ke02) 
    FROM dbo.KonfigTableOne Ap CROSS JOIN
         dbo.KonfigTableTwo Ep
    WHERE Ap.P02Dec = 1 AND
          Ap.Ke01 + '|' + Ap.Ke02 IN ( . . . )  -- valid options here;

我在这里没有看到动态 SQL 的作用。

也就是说,如果KonfigTableTwo 有多于一行,您的查询将毫无意义。这会导致对KonfigTableOne 的多次可能更新。但是,数据库只会使用任意匹配更新该行一次。

我建议您提出一个新问题。提供样本数据、期望的结果以及您想要完成的任务的说明。

【讨论】:

    猜你喜欢
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-21
    • 1970-01-01
    • 1970-01-01
    • 2023-02-05
    • 2010-10-09
    相关资源
    最近更新 更多