0

MySQL Text 列の最初の出現を置き換える関数を書きましたが、少し複雑です...

UPDATE
  table_name
SET
  column=CONCAT(
           LEFT(column,LOCATE('some string', column)-1),
           CONCAT(substring(column, LOCATE('some string', column) + $length),
           'new string'))

$length置換する文字列の長さはどこにありますか。PHP を使用する場合はstrlen()関数ですが、MySQL ではCHAR_LENGTH()関数になります。

テキスト列の最初の一致のみを置き換えるより良い方法を知っていますか?

4

2 に答える 2

2

TRIMを使用できます:

UPDATE table_name SET column = TRIM(LEADING 'some string' FROM column);

「何らかの文字列」が「列」の内容の先頭に複数の連続した出現を持たないと仮定します。

したがって、列に次のものが含まれていれば機能します。

"some string foo some string"

ただし、次の場合は対象外です:

"some string some string foo some string"

編集 - プロセスを簡素化するためにMySQL機能を追加

あなたが使用しているメカニズムに代わるものはわかりませんが、MySQL で関数を作成することで実行を簡素化できます (特権がある場合):

delimiter $$

create function replace_first(
   p_text_to_search varchar(255),
   p_text_to_replace varchar(255)
)
returns varchar(255)
begin
   declare v_found_pos int(11);
   declare v_found_len int(11);
   declare v_text_with_replacement varchar(255);

   select locate(p_text_to_replace, p_text_to_search)
   into   v_found_pos;

   select char_length(p_text_to_replace)
   into   v_found_len;

   select concat(
            left(p_text_to_search, v_found_pos-1),
            mid(p_text_to_search, (v_found_pos + v_found_len))
          )
   into   v_text_with_replacement;

   return v_text_with_replacement;
end$$

delimiter ;

次に、次を使用して呼び出すことができます。

select replace_first('bar foo foo baz foo', 'foo');

結果:

'bar  foo baz'
于 2013-02-27T11:03:35.433 に答える