我有一个值为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
脚本了。
答案 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>