2

次のことを行う必要があり、構文に苦労しています。

'mytable'というテーブルと'mycolumn'(文字列)という列があります。

mycolumnでは、値は構築された値です。たとえば、値の1つは「first:10:second:18:third:31」です。mycolumnの値はすべて同じパターンを使用しており、ID/番号のみが異なります。

18の値(この特定の場合)を別のテーブルキーの値に変更する必要があります。18を22に置き換えたため、この列値の最終結果は「first:10:second:22:third:31」になります。ルックアップ値として18を使用して、別のテーブルから22を取得しました。

したがって、理想的には次のようになります。

UPDATE mytable 
SET mycolumn = [some regex function to find the number between 'second:' and ":third" - 
let's call that oldkey - and replace it with other id from another table - 
(select otherid from tableb where id = oldkey)].

mysqlにREPLACE関数があることは知っていますが、それでは十分ではありません。

4

3 に答える 3

1

独自の関数を作成できます。正規表現が怖いので、SUBSTRINGとSUBSTRING_INDEXを使用します。

CREATE FUNCTION SPLIT_STRING(str VARCHAR(255), delim VARCHAR(12), pos INT)
RETURNS VARCHAR(255)
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(str, delim, pos),
   LENGTH(SUBSTRING_INDEX(str, delim, pos-1)) + 1),
   delim, '');

SPLIT_STRING('first:10:second:18:third:31', ':', 4)

18を返します

この答えに基づいて:

MySQLで文字列を操作するためのexplode()と同等

于 2012-06-29T18:25:56.257 に答える
1

グループに一致する次のようなものが必要です。

WHERE REGEXP 'second:([0-9]*):third'

ただし、MySQLには正規表現置換関数がないため、ユーザー定義関数を使用する必要があります。

REGEXP_REPLACE?(text, pattern, replace [,position [,occurence [,return_end [,mode]]])

ユーザー定義関数はここで利用できます:

http://www.mysqludf.org/lib_mysqludf_preg/

于 2012-06-29T18:06:07.643 に答える
1

MySQLの問題は、REGEXフレーバーが非常に制限されており、バックリファレンスや正規表現置換をサポートしていないことです。これにより、MySQLだけで必要な値を置き換えることがほとんど不可能になります。

スピードヒットを意味することはわかっていますが、IDで目的の行を選択することを検討するか、どのように選択しても、PHPまたはMySQLとインターフェイスする言語で値を変更し、 UPDATEクエリ。

一般的に言って、プログラミング言語の正規表現ははるかに強力です。

これらのクエリをスリムかつ迅速に保つ場合は、スピードヒットを大きくしすぎないようにする必要があります(おそらく無視できる程度です)。

また、MySQLのREGEXでできることに関するドキュメントもあります。http://dev.mysql.com/doc/refman/5.1/en/regexp.html

乾杯

編集:

正直なところ、eggyalのコメントは、あなたの状況(単純なint値)にとってはるかに理にかなっています。それらを列に分割するだけで、そのようにそれらにアクセスする理由はまったくありません。

于 2012-06-29T18:10:02.713 に答える