Выберите подстроку между последним набором символов из последнего

#sql #sql-server #substring

#sql #sql-сервер #подстрока

Вопрос:

Мне нужно извлечь подстроку между 2 символами ( «[» и «]» ), но только для последней итерации.

вот примеры:

 ╔═════════════════════════════════════════════════════════════════════════════════════╦═══════════════════╗
║ Text                                                                                ║ Expected result   ║
╠═════════════════════════════════════════════════════════════════════════════════════╬═══════════════════╣
║ :OR1[253427815][11 Sep 2020][000685f383][Craft Labor ST][Standard]                  ║ Standard          ║
╠═════════════════════════════════════════════════════════════════════════════════════╬═══════════════════╣
║ :OR1[252348249][11 Sep 2020][0006ff85383][Craft Labor-Allowance][Skill Rate 7]      ║ Skill Rate 7      ║
╠═════════════════════════════════════════════════════════════════════════════════════╬═══════════════════╣
║ :OR1[2545528250][11 Sep 2020][00068ff5383][Craft Labor-Allowance][Attendance]       ║ Attendance        ║
╠═════════════════════════════════════════════════════════════════════════════════════╬═══════════════════╣
║ :OR1[2528454248][11 Sep 2020][000685383][Craft Labor-Allowance][Overtime]           ║ Overtime          ║
╠═════════════════════════════════════════════════════════════════════════════════════╬═══════════════════╣
║ :OR1[25254548247][11 Sep 2020][000685383][Craft Labor-Allowance][Weather Allowance] ║ Weather Allowance ║
╚═════════════════════════════════════════════════════════════════════════════════════╩═══════════════════╝
  

Я пробовал использовать комбинацию substring и charindex:

 SELECT text, SUBSTRING( text, CHARINDEX( '][', text)   2, 11 ) AS Expected_result
  

но я думаю, что я должен сделать это для поиска правильного и получить все, кроме последнего «]», только после нахождения комбинации «][«

имеет ли это смысл? выберите форму справа, пока не найдете первый] [ а затем получите все, кроме последнего]

Ответ №1:

Одним из методов является:

 select replace(s.value, ']', '')
from t cross apply
     string_split(t.text, '[') s
where t.text like concat('%$[', s.value) escape '$';
  

Альтернатива в более ранних версиях:

 select t.*, replace(replace(v.str, '[', ''), ']', '')
from t cross apply
     (values (stuff(t.text, 1, len(t.text) - charindex('[', reverse(t.text)), ''))) v(str);
  

Здесь находится db<>fiddle.

Комментарии:

1. Я получаю сообщение об ошибке в string_split У меня есть sql-server 2014, и, может быть, вы знаете способ сделать это без перекрестного применения? только в select?

2. @Baldie47, это возможно. Пожалуйста, посмотрите мой ответ. STRING_SPLIT был предоставлен в SQL Server 2016.

3. Спасибо @Gordon хотя у меня это не сработало, я уверен, что это моя вина, так как ваши ответы обычно правильные 🙂 спасибо!

4. @Baldie47 . . . Есть db<>fiddle, иллюстрирующий, что оба работают.

Ответ №2:

Попробуйте это:

 SELECT REPLACE(RIGHT([text], CHARINDEX('[]', REVERSE([text]))-1), ']', '') AS Expected_result
  

SQLFiddle