2013-01-22 66 views
1

我有值cell = '0,B,1,D,4,T...'(最壞情況)一個小區的小區更新SQL表對多種方案

我想在更新值爲'b,B,d,D,t,T...'(最好的情況下)

有時候我發現價值可以是'0,B,d,D,t,T..',所以它的值不固定。

我想要做的是在單元格中進行一種多重檢查,並替換我想要的位,直到它具有最佳情況值。例如:

UPDATE some_table 
SET some_table.some_col = REPLACE(some_table.some_col, '0,B', 'b,B') 
WHERE some_table.some_row = 'RELATED_ROW' 
     AND some_table.some_col LIKE'%0,B%' 

UPDATE some_table 
SET some_table.some_col = REPLACE(some_table.some_col, '1,D', 'd,D') 
WHERE some_table.some_row = 'RELATED_ROW' 
     AND some_table.some_col LIKE'%1,D%' 
. 
. 
. 

但我想知道是否有可能在單個語句中做到這一點?這樣我就不必執行很多分離的UPDATE腳本。

+0

意思是,你需要用字母(小寫字母繼續)來更新所有的數值。 – TechDo

+0

爲什麼你首先存儲逗號分隔值?這聽起來像一個可怕的想法。 –

回答

1

你可以嵌套多個REPLACE調用到彼此在一條語句:

UPDATE some_table 
SET some_table.some_col = REPLACE(REPLACE(...(some_table.some_col, 
           '0,B', 'b,B'), 
           '1,D', 'd,D'), 
           ... , ... 
          ) 
WHERE some_table.some_row = 'RELATED_ROW' 
     AND (some_table.some_col LIKE '%0,B%' 
     OR some_table.some_col LIKE '%1,D%' 
     OR some_table.some_col LIKE ... 
     ) 
; 

或者,如果這是SQL Server的2005+,你可以去這樣的:

UPDATE t 
SET t.some_col = xN.result 
FROM some_table t 
     CROSS APPLY (SELECT REPLACE(t.some_col, '0,B', 'b,B')) x1 (result) 
     CROSS APPLY (SELECT REPLACE(x1.result , '1,D', 'd,D')) x2 (result) 
     ... 
     CROSS APPLY (...         ) xN (result) 
WHERE t.some_row = 'RELATED_ROW' 
     AND (t.some_col LIKE '%0,B%' 
     OR t.some_col LIKE '%1,D%' 
     OR t.some_col LIKE ... 
     ) 
; 

在無論是哪種情況,您也可以考慮省略條件的最後部分,

 AND (t.some_col LIKE '%0,B%' 
     OR t.some_col LIKE '%1,D%' 
     OR t.some_col LIKE ... 
     ) 

如果多個LIKE測試的影響會覆蓋潛在的非更新更新(即這些更新並沒有真正改變價值,但是卻發生並因此影響整體表現)。