您好我是SQL的新手,我想使用Case语句。
我目前有这个SQL语句
update tblAccount set FullName = rtrim(isnull(FirstName,''));
update tblAccount set FullName = FullName + ' ' + rtrim(MI)
where substring(reverse(MI),1,1)='.';
update tblAccount set FullName = FullName + ' ' + rtrim(MI) + '.'
where substring(reverse(MI),1,1)!='.'
and MI is not null and len(rtrim(MI)) = 1;
update tblAccount set FullName = FullName + ' ' + rtrim(MI)
where len(rtrim(MI)) >= 2;
update tblAccount set FullName = FullName + ' ' + LastName;
update tblAccount set FullName = FullName + ', ' + Suffix
where Suffix is not null
and len(rtrim(Suffix)) > 0;
我希望将其转换为更小,更易读的内容,我被告知Case声明可能会有所帮助,但我很熟悉它,我想知道是否有人能帮助将其转换为更易读的内容。
答案 0 :(得分:2)
它可以成为一个语句,但是因为你的代码重新修改了同一个列,你必须嵌套并组合函数调用,这将是一个绝对巨大的声明,因此远远不够比您当前的代码可读。
此外,执行顺序很重要,因此维护和调试单个语句会更加困难。
保持原样。你拥有的是好的。
关于性能,我是否可以说代码的维护和清晰度每次都超过性能(只要性能“可接受”)。
也就是说,您当前的调用都需要全表扫描,而单个语句只需要一个。但是,根据表的大小,在第一次扫描之后,表可能会缓存在内存中,并且单个语句可能非常复杂,实际上比当前代码慢。
您必须对其进行测试,但除非出现问题,否则不应考虑性能 - 请勿尽早优化代码。
答案 1 :(得分:1)
我会像这样重写它,只是稍微升级一下性能,但我认为它的可读性更强,就像@Bohemian说的那样。
--MIDDLE NAME?
update tblAccount
set FullName =
case when substring(reverse(MI),1,1)='.' THEN -- FIRST + SECOND UPDATE
rtrim(isnull(FirstName,'')) + ' ' + rtrim(MI)
case when substring(reverse(MI),1,1)!='.' and MI is not null and len(rtrim(MI)) = 1 THEN --FIRST AND THIRD UPDATE
rtrim(isnull(FirstName,'')) + ' ' + rtrim(MI) + '.'
else -- FIRST UPDATE
rtrim(isnull(FirstName,''));
end
GO
-- LASTNAME
update tblAccount
set FullName = case when len(rtrim(MI)) >= 2 THEN
(FullName + ' ' + rtrim(MI)) + ' ' + LastName
else
FullName + ' ' + LastName;
END
GO
-- SUFFIX
update tblAccount
set FullName = FullName + ', ' + Suffix
where Suffix is not null
and len(rtrim(Suffix)) > 0;
答案 2 :(得分:0)
一般表格是
CASE WHEN <condition> THEN <value> ELSE <somethingElse> END
可以重复WHEN <condition> THEN <value>
,ELSE <somethingElse>
是可选的
案例陈述可以用作控制结构,如存储过程或脚本,或内联,如SELECT
。
您的更新语句与此相同:
UPDATE tblAccount SET FullName =
rtrim(isnull(FirstName,''))
+ CASE
WHEN substring(reverse(MI),1,1)='.' THEN ' ' + RTRIM(MI)
+ CASE WHEN where len(rtrim(MI)) >= 2 THEN RTRIM(MI) END
WHEN MI is not null and len(rtrim(MI)) = 1 THEN rtrim(MI) + '.'
+ CASE WHEN where len(rtrim(MI)) >= 2 THEN RTRIM(MI) END
ELSE
+ CASE WHEN where len(rtrim(MI)) >= 2 THEN RTRIM(MI) END
END
+ ' ' + LastName
+ CASE
WHEN Suffix IS NOT NULL AND len(rtrim(Suffix)) > 0 THEN ', '+Suffix
END
你有6个更新,nrs 1,5和6很简单,它们几乎被复制到上面的一个语句中。记录更新2将不会被3触及,并且4可以(根据您的代码,数据可能证明其他情况)与2,3或两者都不会发生,因此4次重复。
当然,我完全不同意你的陈述很好的论点。如果你需要的是一次更新,而不是一次更新。也不要接受不回答的压力。
玩得开心!
在你学习的同时看看COALESCE()。