我有一张这样的表
ROW ID | CONTENT
------------------------------------------------
test1 | foo, foo, foo
test2 | bar, bar
test3 | foo, foo
test4 | foo, foo, foo, foo
我想要实现的是查询,它为我提供了行,但是它限制了子串的出现。
一些例子可能是:
有没有办法做到这一点?提前谢谢!
P.S。 :我应该提到','可以是没有可预测长度的任何字符串。
答案 0 :(得分:1)
MySQL 5.5.32架构设置:
CREATE TABLE Table1
(`ROW ID` varchar(5), `CONTENT` varchar(18))
;
INSERT INTO Table1
(`ROW ID`, `CONTENT`)
VALUES
('test1', 'foo, foo, foo'),
('test2', 'bar, bar'),
('test3', 'foo, foo'),
('test4', 'foo, foo, foo, foo')
;
查询1 :
SELECT *
FROM Table1
WHERE ((LENGTH(CONTENT) -
LENGTH(REPLACE(CONTENT, ',', ''))) + 1) < 3
AND SUBSTRING(CONTENT,1,LENGTH('FOO')) = 'FOO'
<强> Results 强>:
| ROW ID | CONTENT |
|--------|----------|
| test3 | foo, foo |
编辑:
如果你正在处理短语,它可能看起来像这样:
MySQL 5.5.32架构设置:
CREATE TABLE Table1
(`ROW ID` varchar(5), `CONTENT` varchar(48))
;
INSERT INTO Table1
(`ROW ID`, `CONTENT`)
VALUES
('test1', 'foo de foo refe foo'),
('test2', 'bar re bar'),
('test3', 'foo rer ef foo'),
('test4', 'foo rer foo fsdfs foo dfsfe foo')
;
查询1 :
SELECT *
FROM Table1
WHERE (LENGTH(CONCAT(' ',CONTENT,' ')) -
LENGTH(REPLACE(CONCAT(' ',UPPER(CONTENT),' '),
CONCAT(' ','FOO',' '), '')))
/(LENGTH('FOO')+2) < 3 AND
CONCAT(' ',CONTENT,' ') LIKE CONCAT('% ','FOO',' %')
<强> Results 强>:
| ROW ID | CONTENT |
|--------|----------------|
| test3 | foo rer ef foo |
答案 1 :(得分:0)
您想要计算列表中foo
的数量。这很简单:
select t.*
from t
where (char_length(concat(', ', content, ', ')) -
char_length(replace(concat(', ', content, ', '), ', foo, ', '1234567'))
) = 3;
我们的想法是将'foo'
替换为少一个字符的东西。但是,您可能需要小心使用'foobars'
和'barfood'
以及可能导致误报的其他字符串。因此,这个版本只是将分隔符放在字符串的开头和结尾。
获得此信息后,您可以进行任何您想要的比较。
答案 2 :(得分:0)
SUBSTRING_COUNT
这样的东西,它不存在。您可以做的是,基于this answer`计算该值。
这样的事可能有用:
SELECT rowid,
(LENGTH(content) - LENGTH(REPLACE(content, 'foo', ''))) / LENGTH('foo') AS cnt
FROM thetable
HAVING cnt > 0 && cnt < 4;