获取SQL Server中特定字符前后的名称

获取SQL Server中特定字符前后的名称,sql,sql-server,Sql,Sql Server,我在数据库中获得以下条目: \\folder.abc\es\Folder-A\\2020-08-03\namefile.csv 因此,基本上,我想要在最后一个\之后和之前的所有内容 该示例中的namefile 提前感谢。您可以使用: select t.*, left(s.value, charindex('.', s.value)) from t cross apply string_split(t.entry, '\') s where t.entry like c

我在数据库中获得以下条目:

\\folder.abc\es\Folder-A\\2020-08-03\namefile.csv
因此,基本上,我想要在最后一个
\
之后和
之前的所有内容

该示例中的
namefile

提前感谢。

您可以使用:

select t.*, 
       left(s.value, charindex('.', s.value))
from t cross apply
     string_split(t.entry, '\') s
where t.entry like concat('%', s.value);
这会将字符串拆分为不同的组件,并匹配字符串末尾的组件。如果组件可以重复,则上述内容可以返回重复项。通过将更多逻辑移到
应用
,可以轻松解决这一问题:

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
 

如果您使用的是不支持字符串分割的较旧版本的SQL server。反转功能很方便,如下所示

我所做的步骤是反转字符串,获取“.”的字符位置,获取“\”的字符位置,然后对其应用子字符串函数在两个位置之间切片数据。最后,我再次反转它以获得正确的值

这里有一个例子

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  |
+-----------+
双联杆


您可以只使用字符串函数(REVERSE、CHARINDEX、SUBSTRING)


那你问什么?你试过的不起作用,或者10-100个你不明白的例子,我们可以试着详细说明。但是我可以在数据库中有多个同名的入口,并给出错误,“子查询返回了多个值。当子查询在=、!=、=或者,当子查询用作表达式“您是否可以通过编辑问题共享您正在尝试的确切SQL语句。子查询错误与您提出的问题无关?”
  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)   
    )