检查 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”的语句并检查是不是包含文本