我正在用SQL编写案例声明,以确定员工是老将还是老将。有三个包含数据的字段,逻辑将是:
1)如果三个字段中的任何一个表示退伍军人,则该人是退伍军人 2)如果没有一个表示退伍军人,但最后一个表示配偶,则该人为配偶
我写了一个看似有效的案例声明:
CASE
WHEN Flag1 = 'Vet' THEN 'Veteran'
WHEN Flag2 = 'Vet' THEN 'Veteran'
WHEN Flag3 = 'Vet' THEN 'Veteran'
WHEN Flag3 = 'Spouse' THEN 'Veteran Spouse'
ELSE 'Non Veteran/Spouse'
END
我想知道这是否可行,因为我的数据中没有导致失败的情况,而不是因为它被正确地写入了。例如,我没有数据显示前两个标志之一表示vet,标志3是配偶(我希望将其显示为兽医)。我想知道的是:当case语句命中为正时,它是第一个,是否对记录执行操作并移至下一行,或者在下一次查看时执行操作,如果满足这些条件,也要执行操作更改响应(例如:如果flag1为vet,则case语句的输出为Veteran。如果同一行在flag3中包含spouse,则记录将更改为Veteran Spouse吗?)
答案 0 :(得分:4)
您所拥有的是正确的。数据库将按顺序评估WHEN
条件,并使用第一个匹配的条件。
为了娱乐,您也可以这样写:
CASE WHEN 'Vet' IN (Flag1, Flag2, Flag3) THEN 'Veteran'
WHEN Flag3 = 'Spouse' THEN 'Veteran Spouse'
ELSE 'Non Veteran/Spouse'
END
如果这些值在您可以加入的较小的查找表中,那就更好了。
答案 1 :(得分:0)
乔尔的答案是更安全的逻辑。但具有讽刺意味的是,您可以更简单地完成此操作:
select greatest(flag1, flag2, flag3)