45310


下記のテーブルから

[code]

    SELECT contents FROM sample WHERE contents LIKE '%mn%'
    
[/code]

とすると、「jklmnopqr」が返ってきますが、「klmnop」のように、一致した部分の前後2文字を抽出する方法はありますか？

[code]

    sample
    +---+-----------+
    |ID |  contents |
    +---+---------- +
    | 1 | abcdefghi |
    | 2 | jklmnopqr |
    | 3 | stuvwxyz  |
    +---+-----------+
    
[/code]


CC BY-SA 4.0
2018-07-03T06:46:33.850
45259
2018-07-04T12:11:38.467
28019
question
sql
SQLのLIKE文で一致した部分から前後数文字を抽出したい


PostgreSQLなら substring に正規表現が記述できます

[code]

    SELECT substring('jklmnopqr' from '.{0,2}mn.{0,2}');
    
[/code]

MySQLでも 8.0+ なら regexp_replace で似たようなことができます

[code]

    SELECT regexp_replace('jklmnopqr', '^.*?(.{0,2}mn.{0,2}).*?$', '$1', 1, 0, 'c');
    
[/code]

MySQL < 8.0 なら、マッチ位置から前後数文字を切り出すロジックを地道に記述する他ないと思います

[code]

    SELECT
      id,
      contents,
      substring(contents, left_index, right_index - left_index + 1)
    FROM (
      SELECT
        id,
        contents,
        CASE
          WHEN ind = 0 THEN 0
          WHEN ind >= 3 THEN ind - 2
          ELSE 1
        END AS left_index,
        CASE
          WHEN ind = 0 THEN -1
          WHEN ind + length('mn') + 1 >= len THEN len
          ELSE ind + length('mn') + 1
        END AS right_index
      FROM (
        SELECT
          id,
          contents,
          locate('mn', contents) AS ind,
          length(contents) AS len
        FROM (
          SELECT 1 AS id, 'jklmnopqr' AS contents
        ) sample
      ) sample
    ) sample;
    
[/code]


CC BY-SA 4.0
2018-07-04T12:11:38.467
45310
2018-07-04T12:11:38.467
9796
45259
answer