【问题标题】:Extract a part of string between multiple delimiters在多个分隔符之间提取字符串的一部分
【发布时间】:2023-03-10 16:09:02
【问题描述】:

我有一个值为“/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;

【问题讨论】:

  • MySQL 还是 SQL Server?它们是两种截然不同的产品......

标签: sql sql-server


【解决方案1】:

使用string_split():

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

【讨论】:

    【解决方案2】:

    您可以使用 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            |
    +-----------------+
    
    

    【讨论】:

      猜你喜欢
      • 2016-09-05
      • 1970-01-01
      • 2018-10-13
      • 1970-01-01
      • 2016-02-10
      • 1970-01-01
      • 2011-08-22
      • 1970-01-01
      • 2012-05-20
      相关资源
      最近更新 更多