我正在使用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 |
第二个结果是预期的,但第一个 - 我希望它从字符串的开头开始,直到“apple”之后的10个字符。
我的查询有什么问题或我该如何解决?我也查询了数百万行,所以我假设一个子查询来检查它的位置是否小于“字符串”的长度不符合要求?
答案 0 :(得分:1)
这样的事情:
SELECT SUBSTRING(name,
GREATEST(1, LOCATE('apple', name) - 10),
15 + LEAST(LOCATE('apple', name), 10)
)
FROM demo
WHERE name like '%apple%'
答案 1 :(得分:1)
试试这个:
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%'