Получить имя после и перед определенным символом на SQL сервере - PullRequest
0 голосов
/ 03 августа 2020

Я получил следующую запись в моей базе данных:

\\folder.abc\es\Folder-A\\2020-08-03\namefile.csv

Итак, в основном, я хочу, чтобы все было после последнего \ и до .

namefile в этом пример

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 03 августа 2020

Если вы используете старую версию SQL сервера, которая не поддерживает string_split. Функция реверса пригодится следующим образом.

Шаги, которые я делаю, это перевернуть строку, захватить позицию символа ".", Захватить позицию символа "\", затем применить к ней функцию подстроки для нарезки данные между двумя позициями. Наконец, я снова меняю его, чтобы получить правильное значение.

Вот пример

with data
  as(select '\\folder.abc\es\Folder-A\\2020-08-03\namefile.csv' as col
    )
select reverse(substring(reverse(col)
                ,charindex('.',reverse(col))+1
                ,charindex('\',reverse(col))
                 -
                 charindex('.',reverse(col))-1
                 )
               ) as file_name
  from data    


+-----------+
| file_name |
+-----------+
| namefile  |
+-----------+

dbfiddle link

https://dbfiddle.uk/?rdbms=sqlserver_2014&fiddle=8c0fc11f5ec813671228c362f5375126

1 голос
/ 03 августа 2020

Вы можете использовать:

select t.*, 
       left(s.value, charindex('.', s.value))
from t cross apply
     string_split(t.entry, '\') s
where t.entry like concat('%', s.value);

Это разбивает строку на разные компоненты и совпадает с тем, который находится в конце строки. Если компоненты могут повторяться, вышеуказанное может вернуть дубликаты. Это легко решить, переместив больше logi c в apply:

select t.*, s.val
from t cross apply
     (select top (1) left(s.value, charindex('.', s.value)) as val
      from string_split(t.entry, '\') s
      where t.entry like concat('%', s.value)
     ) s
 
0 голосов
/ 03 августа 2020

Вы можете просто использовать строковые функции (REVERSE, CHARINDEX, SUBSTRING).

  SELECT
    REVERSE(
    SUBSTRING(REVERSE('\\folder.abc\es\Folder-A\\2020-08-03\namefile.csv'), 
    CHARINDEX('.',REVERSE('\\folder.abc\es\Folder-A\\2020-08-03\namefile.csv'))+1,
    CHARINDEX('\',REVERSE('\\folder.abc\es\Folder-A\\2020-08-03\namefile.csv'))- 
    CHARINDEX('.',REVERSE('\\folder.abc\es\Folder-A\\2020-08-03\namefile.csv'))-1)) 

OR

   SELECT
    REVERSE
    (
    SUBSTRING(  --get filename
    reverse(path), --to get position last \
    CHARINDEX('.',reverse(path))+1,
    CHARINDEX('\',reverse(path))- CHARINDEX('.',reverse(path))-1)   
    )     
   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...