我使用mysql的SUBSTRING()函数和LOCATE()来捕获字符串前后的"n“字符。
例如,使用字符串"apple“。当我查询时,它可以正常工作,除非字符串"apple“接近字符串的开头,因为之前的10个字符可能不存在:
http://sqlfiddle.com/#!9/f41f8d/5
CREATE TABLE demo (name varchar(1000));
INSERT INTO demo (name) VALUES
("An apple a day keeps the doctor away"),
("A doctor a day keeps the apple away from the doctor");
SELECT SUBSTRING(
`name`,
LOCATE("apple",`name`) - 10, /* from 10 characters before 'string'*/
(25) /* to 10 characters after the 5 strlen string (so 10 + 5 + 10) */
)
FROM demo
WHERE name like '%apple%'结果
| r away |
| keeps the apple away from |第二个结果是预期的,但第一个-我希望它开始在字符串的开头,直到10个字符后的“苹果”。
我的查询有什么问题,或者我如何修复它?我还查询了数百万行,所以假设一个子查询来检查它的位置是否小于“string”的长度是否是表演性的?
发布于 2017-07-22 03:06:04
试着用这个:
SELECT SUBSTRING(
`name`,
GREATEST(LOCATE("apple",`name`) - 10, 1), /* from 10 characters before 'string'*/
LEAST(25, LENGTH(name) - GREATEST(LOCATE("apple",`name`) - 10, 1)) /* to 10 characters after the 5 strlen string (so 10 + 5 + 10) */
)
FROM demo
WHERE name like '%apple%'发布于 2017-07-22 02:40:42
就像这样:
SELECT SUBSTRING(name,
GREATEST(1, LOCATE('apple', name) - 10),
15 + LEAST(LOCATE('apple', name), 10)
)
FROM demo
WHERE name like '%apple%'https://stackoverflow.com/questions/45250099
复制相似问题