Mysql LIKE通配符有时存在值

时间:2012-10-21 04:22:42

标签: php mysql

标题可能有点令人困惑,但我可以在这里澄清一下。

我正在尝试使用mysql的LIKE来匹配有时被a包围的值:或者有时它可以在一侧,或者有时也不是。我知道通配符%,但会选择所有内容,所以我找到_哪个会起作用,但它总是选择那个单个字符,我只想选择那个字符,如果它是:否则不行。

仍然困惑?这是一个例子。

假设我在表'que'中有一个名为'name'的列,在'name'列中我得到了'sdfgsdfgsdfg:jimmy:asfds'的值我想选择':jimmy:'但是如果相反价值是'sdfgsdfgsdfg:jimmy'我只想选择':jimmy'。

另一个例子。

用正则表达式来表达它,如果有帮助的话就像这样(:?)jimmy(:?)。

目的是什么?

我想从该值中删除jimmy并将其替换为: 我正在尝试将多个名称存储到一个列中,并且需要删除那个人。

到目前为止我得到了这样的东西:

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

1 个答案:

答案 0 :(得分:1)

  

用正则表达式来表达它,如果有帮助的话就像这样(:?)jimmy(:?)。

所以使用REGEXP

  

我正在尝试将多个名称存储到一个列中,并且需要删除该一个人。

不要那样做。使用您的RDBMS的关系功能和normalise您的架构:

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