Как извлечь подстроки из нескольких разделителей, таких как «\» в SQL Server 2014? - PullRequest
1 голос
/ 22 октября 2019

У меня есть такая строка '/ 1064_MyHoldings / ONLINE / Adhoc / Rpt_CompanyCodeElig' Я просто хочу извлечь '1064_MyHoldings' только так, как мудро, есть разные строки, подобные этой, где я просто хочу 1-ю часть строки между первыми двумя разделителями?

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 

, где Applications - это имя столбца, имеющего такие данные, как '/ 1064_MyHoldings / ONLINE / Adhoc / Rpt_CompanyCodeElig'

Ожидаемый результат должен быть '1064_MyHoldings', который является только первой частью строки междупервые два '/'

Ответы [ 2 ]

1 голос
/ 22 октября 2019

Уродливый, но потенциально более гибкий подход, основанный на ответе Тима, где вы можете указать, какую часть строки вы хотите. Я обновил это решение для работы со строками, которые могут не начинаться с разделителя.

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] выдаст вам ONLINE пример строки. ELSE не установлен на «NA», потому что я думал, что вы захотите первый элемент вашей строки, когда у вас меньше 2 разделителей.

1 голос
/ 22 октября 2019

Здесь мы можем использовать функции базовой строки. Например, чтобы найти подстроку, содержащуюся в первых двух /, мы можем попробовать:

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;

Но,это будет работать снова, только если вы знаете, что / будет первым символом в пути. В противном случае вам понадобится более подробная версия, приведенная выше.

...