我有一个SQL查询,如:
SELECT name,user from table where user LIKE '%bob%'
我希望,不是显示所有字段,而是在" bob"之前和之后只能获得30个字符。
如果不可能,则只需要在" bob"之后的30个字符。图案。
示例:字段包含aaaaaaaaaabbbbbbbbbbcccccccccc123456789 bob ppppppppppoooooooooouuuuuuuuuyyyyyyyyyy"那么,输出将是:
所以在这种情况下,输出将是" bbbbbbbbbbcccccccccc123456789 bob ppppppppppoooooooooouuuuuuuuuu"
感谢您的帮助
(如果有帮助,DBMS是mysql)
答案 0 :(得分:1)
您可以使用LOCATE()
查找子字符串的索引,从而模拟LIKE
- 类似的行为。
如果排序规则是字符串不敏感,并且字符串是非二进制的(即(var)char
,而不是(var)binary
)。
SELECT
`otherColumn`,
CASE
WHEN LOCATE('bob', yourColumn) < 30
THEN SUBSTRING(yourColumn, 1, LOCATE('bob', yourColumn) + CHAR_LENGTH('bob') + 30)
ELSE
SUBSTRING(yourColumn, LOCATE('bob', yourColumn) - 30, CHAR_LENGTH('bob') + 60)
END AS `Text`,
`anotherColumn`
FROM
`table`
WHERE
LOCATE('bob', yourColumn) IS NOT NULL
此查询受mysql select content around keyword启发,查找yourColumn
中至少出现一次“bob”的记录,并在该单词的第一个实例周围返回30个字符 - 如果有足够的文本。
如果“bob”小于30个字符到列值的开头,则查询会在第一次出现“bob”之后将字符串的开头返回到30个字符。
您可能希望将其添加到参数化查询或存储过程中。
如果您碰巧想要构建全文搜索引擎,请考虑使用现有解决方案。
答案 1 :(得分:0)
我会使用charindex函数来解决这个问题。 Charindex返回指定字符串的起始位置(因此是INT数据类型)。
DECLARE @string VARCHAR(MAX) = 'abc123456789012345678901234567890bob123456789012345678901234567890abc'
DECLARE @FindBob INT = CHARINDEX('bob', @string)
SELECT String = @string ,
FindBob = @FindBob ,
FinalString = SUBSTRING(@string, @FindBob-30, 63)
答案 2 :(得分:0)
如果模式(“bob”)只能在字符串中出现一次,您可以使用SUBSTRING_INDEX
来分割字符串:
select
substring_index(user, 'bob', 1) as part1,
substring_index(user, 'bob', -1) as part2
from some_table
where user like '%bob%';
要将子字符串限制为30个字符,您可以使用left()
和right()
函数:
select
right(substring_index(user, 'bob', 1), 30) as part1,
left (substring_index(user, 'bob', -1), 30) as part2
from some_table
where user like '%bob%';