2011-09-06 16 views
3

我的代碼如下:SQL REPLACE功能,如何更換單個字母

REPLACE(REPLACE(cc.contype,'x','y'),'y','z') as ContractType, 

這正確更換的,我想什麼,但它unfortunatley改變所有「Z的」爲「y的」當我想

X> Y
Y> Z^

這是否有道理?我不希望所有新的Y在我的第二個REPLACE函數中再次改變。在Microsoft Access,我會做到這一點有以下

IIF(cc.contype = X,Y,IIF(cc.contype = Y,X))

但我不知道如何表述這SQL,我最好用客戶端語言來做這種事情嗎?

非常感謝。

編輯:也嘗試過,沒有運氣:

 CASE WHEN SUBSTRING(cc.contype, 1, 1) = 'C' 
     THEN REPLACE(cc.contype, 'C', 'Signed') 
     CASE WHEN SUBSTRING(cc.contype, 1, 1) = 'E' 
     THEN REPLACE(cc.contype, 'E', 'Estimate') as ContractType, 

回答

6

嘗試一輪做它的其他方式,如果你不希望新的 「Y」 的成爲 「Z」 的:

REPLACE(REPLACE(cc.contype,'y','z'),'x','y') as ContractType 
4

不是我處理的子欄目的表現殺死進程的忠實粉絲,但在我看來,你可以這樣做只是通過反向排序:

replace(replace(cc.contype,'y','z'),'x','y') as ContractType, 

這將所有的y人物蛻變到zx角色嬗變到y


如果你是一個更通用的解決方案後,你可以不喜歡被聯合查詢:

select 'Signed: ' || cc.contype as ContractType 
    wherecc.contype like 'C%' from wherever 
union all select 'Estimate: ' || cc.contype as ContractType 
    where cc.contype like 'E%' from wherever 

,而無需幫助你在所有子(在前綴字符串比較的輕微代價比修改它,並且當然也添加其他所需條件)。這通常比每行函數更有效率。

某些DBMS'將實際並行運行這些子查詢以提高效率。


當然,理想解決辦法是改變你的架構,這樣你不處理的子欄目。將contype列分爲兩列,將第一個字符存儲爲contype_firstcontype_rest

然後,每當你想充分contype

select contype_first || contype_rest ... 

對於當前查詢,然後你可以使用一個查找表:

lookup_table: 
    first char(1) primary key 
    description varchar(20) 

包含:

first description 
----- ----------- 
C  Signed: 
E  Estimate: 

和查詢:

select lkp.description || cc.contype_rest 
    from lookup_table lkp, real_table cc 
    where lkp.first = cc.first ... 

與在每一行上重複字符串替換的查詢相比,這兩個查詢可能會非常快。

即使您不能將替換爲帶有兩個獨立列的單列,您至少可以創建兩個新列並使用插入/更新觸發器來保持它們同步。這爲您提供了舊的方式和一種新的改進方式來訪問contype信息。

雖然這在技術上違反了3NF,但出於性能原因,這通常是可以接受的,只要您瞭解和減輕風險(使用觸發器)即可。

+0

你最初改變周圍的秩序已經奏效,但雖然是一種解決方案沒有我期望的那麼強大。特別是對於未來的類似性質的工作。 你的第二個解決方案似乎更像我之後的事情,但我對UNION功能頗爲陌生。我會回去修改這個功能,並在將來使用這個解決方案(如果它有效!) 謝謝。 – Waller

+0

@Walter,'union'只運行兩個查詢,並將所有行組合成一個集合。 'union'將刪除重複項,'union all'不會。在這種情況下,重複是不可能的,因爲兩個子查詢具有不同的值('signed ...'vs'estimate ...'),因此重複刪除的額外步驟是不必要的。 – paxdiablo

0

如何 REPLACE(REPLACE(REPLACE(CC。 ,'y','z'),'ahhhgh','y')作爲合同類型,

ahhhgh可以用任何你喜歡的東西來代替。

+0

是,已更新,ta。 –

相關問題