我的数据库构建如下:
- 值 1、值 2、值 3 | 1
- value4,value5,val"u6 | 2
- 值(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/