mysql SUBSTRING()和LOCATE()

时间:2017-07-22 02:35:30

标签: mysql sql

我正在使用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个字符。

我的查询有什么问题或我该如何解决?我也查询了数百万行,所以我假设一个子查询来检查它的位置是否小于“字符串”的长度不符合要求?

2 个答案:

答案 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%'