提取多个定界符之间的一部分字符串

时间:2020-07-16 21:12:35

标签: sql sql-server

我有一列的值为'/ 1064_MyHoldings / ONLINE / Adhoc / Rpt_CompanyCodeElig'

现在,我的要求是提取分度计之间的每个值; '1064 MyHoldings','ONLINE','Adhoc'等?

我尝试了以下代码,但只使用了“ 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;

2 个答案:

答案 0 :(得分:1)

使用string_split()

select s.value
from t cross apply
     string_split(path, '/') s

答案 1 :(得分:0)

您可以使用CTE进行递归搜索并拆分字符串。

WITH yourTable AS (
    SELECT '/1064_MyHoldings/ONLINE/Adhoc/Rpt_CompanyCodeElig' AS Path
),
cte_splitTable as
(
SELECT value as val, 1 as lvl
from yourTable
cross apply 
string_split(Path,'_')
UNION ALL
SELECT t.value as val, lvl+1 as lvl
from cte_splitTable as c
cross apply
string_split(c.val,'/') as t
where CHARINDEX('/',val) > 0
)
select *  from cte_splitTable
where PATINDEX('%[_/]%',val) = 0 and len(val) > 0

+-----------------+
|       val       |
+-----------------+
| CompanyCodeElig |
| MyHoldings      |
| ONLINE          |
| Adhoc           |
| Rpt             |
| 1064            |
+-----------------+