使用多个方案更新sql表中的单元格

时间:2013-01-22 07:42:18

标签: sql sql-update

我有一个值为cell = '0,B,1,D,4,T...'的单元格(最坏情况)

我想要的是将值更新为'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脚本了。

1 个答案:

答案 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测试的影响超过了潜在的非更新更新的影响(即更新不会真正改变值,但仍会发生,因此会影响整体性能)。< / p>