检查 SQL CASE 语句中是不是存在

Posted

技术标签:

【中文标题】检查 SQL CASE 语句中是不是存在【英文标题】: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);

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

【问题讨论】:

【参考方案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

以上是关于检查 SQL CASE 语句中是不是存在的主要内容,如果未能解决你的问题,请参考以下文章

oracle sql - 选择具有多个“case when”的语句并检查是不是包含文本

在检查约束中使用 case 语句

如果条件sql的case之间存在语句

SQL语句中Case 的用法

java检查char是不是是switch case语句中的数字[关闭]

SQL - 使用 CASE 语句更新,是不是需要多次重复相同的 CASE?