0

タイトルは少し混乱しているかもしれませんが、ここで明確にすることができます。

mysql の LIKE を使用して、 : で囲まれている値、または一方の側にある場合もあれば、どちらでもない場合もある値に一致させようとしています。私はワイルドカード % を知っていますが、それはすべてを選択するので、動作する _ を見つけましたが、常にその単一の文字を選択します。

まだ混乱していますか?これが例です。

テーブル「que」に「name」という列があり、列「name」に「sdfgsdfgsdfg:jimmy:asfds」の値があるとします。「:jimmy:」を選択したいのですが、代わりに値が「 sdfgsdfgsdfg:jimmy' :jimmy のみを選択したい。

もう一つの例。

これを正規表現で達成するには、 (:?)jimmy(:?) のようになります。

目的は何ですか?

その値から jimmy を削除し、に置き換えたい: 複数の名前を 1 つの列に格納しようとしており、その 1 人を削除する必要があります。

これまでのところ、次のようなものがあります。

 UPDATE `que` SET `name`= CASE WHEN `name` LIKE '%jimmy%' THEN replace(`name`, '%jimmy%', ':') ELSE `name` end WHERE 1
4

1 に答える 1

1

これを正規表現で達成するには、 (:?)jimmy(:?) のようになります。

だから使うREGEXP

複数の名前を 1 つの列に格納しようとしており、その 1 人を削除する必要があります。

そうしないでください。RDBMS のリレーショナル機能を使用して、スキーマを正規化します。

CREATE TABLE que_names (
  que_id BIGINT UNSIGNED NOT NULL,
  name   VARCHAR(255)    NOT NULL,
  FOREIGN KEY (que_id) REFERENCES que (que_id)
);

INSERT INTO que_names
  (que_id, name)
VALUES
  (1, 'bob'),
  (1, 'fred'),
  (1, 'james'),
  (2, 'michael'),
  (2, 'jimmy'),
  (2, 'fred')
  -- etc.
;

ALTER TABLE que DROP COLUMN name;

次に、次のようにすべてを削除jimmyします。

DELETE FROM que_names WHERE name = 'jimmy';

必要に応じて、次のように既存のテーブルを取得できます。

SELECT   que.*, GROUP_CONCAT(que_names.name SEPARATOR ':') AS name
FROM     que LEFT JOIN que_names USING (que_id)
GROUP BY que_id
于 2012-10-21T04:28:48.947 に答える