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

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 に答える