如何从多个分隔符(如SQL Server 2014中的'')中提取子字符串?



我有一个这样的字符串'/1064_MyHoldings/ONLINE/Adhoc/Rpt_CompanyCodeElig' 我只想提取'1064_MyHoldings',就像明智的一样,有不同的字符串,我只想在前两个分隔符之间提取字符串的第一部分?

select 
left(Applications, Len(Path) - CHARINDEX('/', Applications) + 1) FolderName 
from 
(select distinct 
Substring(C.Path, CHARINDEX('/', C.Path) + 1, LEN(C.Path) - CHARINDEX('/', C.Path)) Applications) Result 

其中应用程序是具有"/1064_MyHoldings/ONLINE/Adhoc/Rpt_CompanyCodeElig"之类的数据的列名称

预期结果应为"1064_MyHoldings",这只是前两个"/"之间的字符串的第一部分

我们可以在这里利用基本字符串函数。 例如,要查找包含在前两个/中的子字符串,我们可以尝试:

WITH yourTable AS (
SELECT '/1064_MyHoldings/ONLINE/Adhoc/Rpt_CompanyCodeElig' AS Path
)
SELECT
CASE WHEN Path LIKE '%/%/%' THEN
SUBSTRING(Path,
CHARINDEX('/', Path) + 1,
CHARINDEX('/', Path, CHARINDEX('/', Path) + 1) - CHARINDEX('/', Path) - 1)
ELSE 'NA' END AS first_component
FROM yourTable;

演示

对于第一个路径组件以及可能的任何组件,使上述逻辑成为可能的原因是CHARINDEX有一个可选的第三个参数,它允许我们指定搜索分隔符/的起始位置。

注意:如果您确定Path的第一个字符始终只是一个/,那么您可以使用更简单的查询:

SELECT
CASE WHEN Path LIKE '%/%/%'
THEN SUBSTRING(Path, 2, CHARINDEX('/', Path, 2) - 2)
ELSE 'NA' END AS first_component
FROM yourTable;

但是,只有当您知道/是路径中的第一个字符时,这才会再次起作用。 否则,您需要使用上面更详细的版本。

一种丑陋但可能更灵活的方法,基于 Tim 的答案,您可以在其中指定所需的字符串部分。我更新了此解决方案以处理可能不以分隔符开头的字符串。

with cte1 as (select '1064_MyHoldings/' as Path)
,cte2 as (select case when left(Path,1)<>'/' then  '/'+ Path else Path end as Path from cte1)
select  case when Path like '%/%/%'
then cast('<x>'+replace(Path,'/','</x><x>')+'</x>' as xml).value(N'/x[2]','varchar(50)')
else right(Path,len(Path)-1) end as first_component
from cte2

x[2]参数是要更改以获取字符串不同部分的参数。它以2开头,因为字符串之前有一个分隔符。按照逻辑,x[3]会让你"在线"作为你的示例字符串。ELSE没有设置为"NA",因为我认为当您的分隔符少于 2 个时,您会想要字符串的第一个元素。

最新更新