#mysql #sql
Есть таблица Info, где храняться пути, например: /mnt/sd/DATA/LINUX/DATA_2/lin/ToR/Transit/Transit_ILE00-wwwwww1749.txt или /mnt/ssd/DATA/LINUX/DATA_2/lin/ToR/Transit/1/2/Transit_ILE00-MSsdsdsdwww.txt Как выбрать только до последнего вхождения '/', чтобы получилось: /mnt/sd/DATA/LINUX/DATA_2/lin/ToR/Transit/ и /mnt/ssd/DATA/LINUX/DATA_2/lin/ToR/Transit/1/2/ С REGEXP_REPLACE и SUBSTRING_INDEX у меня не получается.
Ответы
Ответ 1
SELECT LEFT(`field`, LENGTH(`field`) - INSTR(REVERSE(`field`),'/')) FROM `Info` UPDATE: Запрос был написан в предположении, что "до последнего вхождения" означает "невключительно". Но в примере последний слэш включён в ответ - значит: SELECT LEFT(`field`, LENGTH(`field`) - INSTR(REVERSE(`field`),'/') + 1) FROM `Info`Ответ 2
Всё как и в обычном программировании: находим последний слэш и обрезаем до него. Для этого используем следующие функции: LOCATE(subset, str) – находит первую встречу подстроки в строке (документация). REVERSE(str) – переставляет символы строки в обратной последовательности (документация). Это нужно чтобы искать последний слэш в строке. LENGTH(str) – возвращает длину строки (документация). Это нужно потому, что мы получаем индекс последнего слэша с конца строки, а нам нужно от её начала. LEFT(str, len) – вырезает левую часть строки по заданной длине (документация). Получается такой код: SELECT LEFT(path_field , LENGTH(path_field) - LOCATE('/', REVERSE(path_field) + 1) FROM sometableОтвет 3
SELECT reverse(substr(reverse('fieldName'), instr(reverse('fieldName'),'/'))) FROM 'tableName'
Комментариев нет:
Отправить комментарий