2013-01-23 56 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子句。

如果你想做多個,使用聯合。

相關問題