我有一个这样的字符串'/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 个时,您会想要字符串的第一个元素。