1

我有一个有价值的单元格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脚本。

4

1 回答 1

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

于 2013-01-22T10:18:47.657 回答