#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