mysql子字符串()和定位()

nhn9ugyo  于 2023-02-15  发布在  Mysql
关注(0)|答案(2)|浏览(82)

我使用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个字符。
我的查询有什么问题,或者我该如何修复它?我还查询了数百万行,所以我假设一个子查询来检查它的位置是否小于"字符串"的长度是没有性能的?

flvtvl50

flvtvl501#

试试这个:

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%'
vwkv1x7d

vwkv1x7d2#

大概是这样的

SELECT SUBSTRING(name,
                 GREATEST(1, LOCATE('apple', name) - 10),
                 15 + LEAST(LOCATE('apple', name), 10)
                )
FROM demo
WHERE name like '%apple%'

相关问题