【问题标题】:Check if exists within SQL CASE statement检查 SQL CASE 语句中是否存在
【发布时间】:2009-02-19 12:08:10
【问题描述】:

我正在尝试根据表中的不同列是否在表 b 的一组结果中来更新表 a 中的列。目前的变化:

update a
set a.field1 =
 case
 when exists (
   select b.field2
   from b
   where b.field2 = a.field2
 )
 then 'FOO'
 else 'BAR'
 end

没有运行。任何想法如何为 DB2 数据库执行此操作?

编辑:感谢您的回答,我能做的就是

update a set field1 = 'FOO' where field2 in (select field2 from b);

update a set field1 = 'BAR' where field2 not in (select field2 from b);

但我会保持打开状态,以防有人可以在顶部找到有效的代码版本。

【问题讨论】:

    标签: sql database db2


    【解决方案1】:

    我在一个 DB2 for iSeries 机器上工作。试试这个:

    update a
    set a.field1 =
     Coalesce( ( select 'FOO'
                 from b
                 where b.field2 = a.field2 ),
                          'BAR' )
    

    Coalesce() 是一个返回列表中第一个非 NULL 的函数。

    【讨论】:

      【解决方案2】:

      这适用于 SQLServer。也许 DB2 也有类似的结构。

      update a SET field1 = 'BAR'
      from a
           left outer join b on b.field1 = a.field1
      where b.field1 is null;
      update a SET field1 = 'FOO'
      from a
           inner join b on b.field1 = a.field1
      

      问候,
      利文

      【讨论】:

      • 这样就可以了。您仍然可以将其放入一个更新语句中,使用 CASE 语句检查表 B 的 PK 中的 NULL,但分两步执行此操作也有好处,并且您现在拥有的内容消除了重复更新。
      • @Tom。我的直觉告诉我,这两次更新可能比一次更新中使用一个案例要快。
      • 语法似乎在 DB2 中不起作用,但您是对的,因为只在两个单独的运行中执行它的精神更清晰。
      • 有效语法(即 DB2 不喜欢更新连接)是 update a set field1 = 'FOO' where field2 in (select field2 from b);更新一个 set field1 = 'BAR' where field2 not in (select field2 from b);如果你提到,我会接受!
      • @Nearly_lunchtime。你想让我提到什么?你自己找到了解决方案。您可以回答自己的问题并接受吗?谢谢你的建议。
      【解决方案3】:

      a.field1 的第一次出现应该是 a.field2。

      您说“表中的不同列是否在集合中......”

      您的代码正在修改同一列,而不是不同的列。

      【讨论】:

        【解决方案4】:

        我不是 SQL 或 DB2 方面的专家,但也许您可以连接这两个表并检查 b.field1 是否为空?

        update a
        set a.field1 = case when b.field1 is not null then 'FOO' else 'BAR' end
        from a full outer join b on a.field1 = b.field1
        

        【讨论】:

        • 您可能希望使用 LEFT OUTER JOIN 而不是 FULL OUTER JOIN
        猜你喜欢
        • 2019-08-01
        • 2013-05-17
        • 1970-01-01
        • 2023-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-01
        相关资源
        最近更新 更多