在SQL查询中,在模式

时间:2017-05-18 19:22:50

标签: mysql sql

我有一个SQL查询,如:

SELECT name,user from table where user LIKE '%bob%'

我希望,不是显示所有字段,而是在" bob"之前和之后只能获得30个字符。

如果不可能,则只需要在" bob"之后的30个字符。图案。

示例:字段包含aa​​aaaaaaaabbbbbbbbbbcccccccccc123456789 bob ppppppppppoooooooooouuuuuuuuuyyyyyyyyyy"那么,输出将是:

  • 之前的30个字符" bob"图案
  • " bob",模式
  • 和" bob"之后的30个字符,模式

所以在这种情况下,输出将是" bbbbbbbbbbcccccccccc123456789 bob ppppppppppoooooooooouuuuuuuuuu"

感谢您的帮助

(如果有帮助,DBMS是mysql)

3 个答案:

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

演示:http://rextester.com/XDR12496