首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mysql SUBSTRING()和LOCATE()

mysql SUBSTRING()和LOCATE()
EN

Stack Overflow用户
提问于 2017-07-22 02:35:29
回答 2查看 8.5K关注 0票数 2

我使用mysql的SUBSTRING()函数和LOCATE()来捕获字符串前后的"n“字符。

例如,使用字符串"apple“。当我查询时,它可以正常工作,除非字符串"apple“接近字符串的开头,因为之前的10个字符可能不存在:

http://sqlfiddle.com/#!9/f41f8d/5

代码语言:javascript
复制
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%'

结果

代码语言:javascript
复制
| r away                    |
| keeps the apple away from |

第二个结果是预期的,但第一个-我希望它开始在字符串的开头,直到10个字符后的“苹果”。

我的查询有什么问题,或者我如何修复它?我还查询了数百万行,所以假设一个子查询来检查它的位置是否小于“string”的长度是否是表演性的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-22 03:06:04

试着用这个:

代码语言:javascript
复制
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%'
票数 1
EN

Stack Overflow用户

发布于 2017-07-22 02:40:42

就像这样:

代码语言:javascript
复制
SELECT SUBSTRING(name,
                 GREATEST(1, LOCATE('apple', name) - 10),
                 15 + LEAST(LOCATE('apple', name), 10)
                )
FROM demo
WHERE name like '%apple%'
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45250099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档