在sql server中,在某些字符之后和之前获取名称

6kkfgxo0  于 2021-07-24  发布在  Java
关注(0)|答案(3)|浏览(295)

我的数据库中有以下条目:

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

所以基本上,我想要最后一次之后的一切 \ 在那之前 . 这个 namefile 在那个例子中
提前谢谢。

mi7gmzs6

mi7gmzs61#

如果您使用的是不支持字符串分割的较旧版本的sql server。反转功能很方便,如下所示。
我所做的步骤是反转字符串,获取“.”的字符位置,获取“\”的字符位置,然后对其应用substring函数在两个位置之间切片数据。最后我再次反转它以得到正确的值。
下面是一个例子

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  |
+-----------+

D小提琴连杆
https://dbfiddle.uk/?rdbms=sqlserver_2014&fiddle=8c0fc11f5ec813671228c362f5375126

rwqw0loc

rwqw0loc2#

您可以使用:

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

这会将字符串拆分为不同的组件,并匹配字符串末尾的组件。如果组件可以重复,上面的可以返回重复的。通过将更多的逻辑移到 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
2q5ifsrm

2q5ifsrm3#

您可以只使用字符串函数(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))

SELECT
    REVERSE
    (
    SUBSTRING(  --get filename
    reverse(path), --to get position last \
    CHARINDEX('.',reverse(path))+1,
    CHARINDEX('\',reverse(path))- CHARINDEX('.',reverse(path))-1)   
    )

相关问题