逗号之间的MySQL字符串搜索

标签 mysql sql

我的数据库构建如下:

  1. 值 1、值 2、值 3 | 1
  2. value4,value5,val"u6 | 2
  3. 值(value) 5,值(value) 6,值(value) 8 |3

(两列,一列用逗号分隔的键,另一列只是一个普通的 var-char)

我正在寻找在引号内查找查询的最可靠方法,但我有点迷路了。

我为此使用了边界这个词:

SELECT * FROM ABC WHERE content REGEXP '[[:<:]]value 5[[:>:]]'

问题是当我执行此查询时:

SELECT * FROM ABC WHERE content REGEXP '[[:<:]]5[[:>:]]'

它还会返回值,这不是我要找的。还有一个问题就是word boundaries指的是quotes是word boundaries

我该如何解决这个问题并创建一个简单的查询,该查询只会获取引号之间的确切完整查询?

顺便说一句 我没有更改数据库结构的选项...

最佳答案

作为@MarcB commented ,你真的应该尝试normalise你的模式:

CREATE TABLE ABC_values (
  id  INT,
  content VARCHAR(10),
  FOREIGN KEY (id) REFERENCES ABC (id)
);

INSERT INTO ABC_values
  (id, content)
VALUES
  (1, 'value1'), (1, 'value2'), (1, 'value3'),
  (2, 'value4'), (2, 'value5'), (2, 'val"u6'),
  (3, 'value 5'), (3, 'value 6'), (3, 'value 8')
;

ALTER TABLE ABC DROP content;

然后,根据需要,您可以执行 SQL join在你的表格之间对结果进行分组:

SELECT   id, GROUP_CONCAT(ABC_values.content) AS content
FROM     ABC LEFT JOIN ABC_values USING (id) NATURAL JOIN (
  SELECT id FROM ABC_values WHERE content = 'value 5'
) t
GROUP BY id

如果完全不可能改变schema,你可以试试FIND_IN_SET() :

SELECT * FROM ABC WHERE FIND_IN_SET('value 5', content)

关于逗号之间的MySQL字符串搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13685899/

相关文章:

java - 在数据库和 postman 上无法看到实际上传的文件(.pdf 格式)格式?

php - 使用php在从html表单获取的日期之间从mysql中选择数据,但日期存储在日、月、年下的3个不同列中

java - 使用特定布局打印列和总计

sql - 预热数据库(将整个数据库放入缓存)

SQL - 从两个不同的表中选择行

sql - 唯一的 6 位数字,但客户 ID 不连续 (SQL)

sql - 聚合后的Elasticsearch过滤器

php - 删除行时如何在mysql自动递增字段中保持正确的数字顺序

php - 删除数百万条在 mysql 中具有重复列值的记录

sql - RegExp_替换 Oracle 中某个单词列表之后的所有内容