2013-01-23 57 views
1

我需要根据另一列值替换最多9列的结果。 如果“角色”列是值“SeniorManagement”,我想用默认值替换默认层次值。 以下是我现在可以做到这一点:SQL根据一列值替换多个值

, CASE 
    WHEN d.Role = 'SeniorManagement' 
    THEN (Replace(p.Firstname,'John','Joe')) END as First 
, CASE 
    WHEN d.Role = 'SeniorManagement' 
    THEN (Replace(p.Lastname,'TopDog','AssignedPerson')) END as Last 
, CASE... 

我的问题是,有没有办法将这些一个更简洁的方式?

伪(我知道:-)

, CASE 
    WHEN d.Role = 'SeniorManagement' 
    THEN (Replace(p.Firstname,'John','Joe')) as First 
    THEN (Replace(p.Lastname,'TopDog','AssignedPerson')) as Last 
    THEN (Replace(p.Email,'[email protected]','[email protected]')) as Email 

感谢

+0

这可能是好的,更好地了解您的需要(例如显示更多查询的),会导致您的示例代码,我会说:好了,只是做'WHERE d.Role ='SeniorManagement'',因为在你的情况下你没有其他条件... –

+0

如果你想更新记录来替换一些其他人,这种方式不是很安全,它可以变得有点当人们拥有相同的名字时会变得凌乱。只需使用多个UPDATE语句与不同的where子句 – jazzytomato

+0

我很欣赏这个建议。谢谢。以下是一些额外的信息。我不允许覆盖任何东西。我这样做的原因是,绝不应该根据任何结果联系顶级玩家。这些结果将显示在一个页面上。层次结构是数字的,每个结果都建立在另一个结果上。所以,如果TopDog最终进入这些领域 - 我需要用他的直接上市报告来替换。 – Sean

回答

1

使用函数怎么办?

create function dbo.GetColumnValue 
(
    @ColumnBasedValue varchar(max), 
    @ColumnToReplace varchar(max), --or the type you want 
    @ToReplace varchar(max), 
    @Replacement varchar(max) 
) 
as 
BEGIN 

return (select case @ColumnBasedValue when 'SeniorManagement' 
         then (Replace(@ColumnToReplace,@ToReplace,@Replacement)) 
         else @replaceValue END) 

END 

,并使用它像

select dbo.GetColumnValue(d.Role, p.Firstname,'John','Joe') as First, 
dbo.GetColumnValue(d.Role, p.Lastname,'TopDog','AssignedPerson') as Last.. 
+0

这看起来不错。我打算玩一下这个。谢谢 – Sean

+0

我快到了。这非常有帮助!当顶级猎狗最终结果时,它完美无瑕。当topdog不在结果中时,它将字段留空。 – Sean

+0

甜!我知道了。你带领我走向正确的道路冈萨洛。对此,我真的非常感激。我做了一个改变到最后: 其他@ColumnToReplace END)这使我可以保留原始值,如果该值不是SeniorManagement。 – Sean

0

此好好尝试一下工作根据上下文是什么,你也许可以用做原料选择脱身。

Select d.Role, 'Joe' as First, 'AssignedPerson' as Last

,只是筛选的每种选择具有where子句。

如果你想做多个,使用联合。

相关问题