Страницы

Поиск по вопросам

воскресенье, 29 декабря 2019 г.

SQL - выбрать из строки до последнего вхождения

#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'

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

Отправить комментарий