SQL String_Split - PullRequest
       31

SQL String_Split

0 голосов
/ 08 ноября 2018

У меня есть таблица со следующими данными:

ColumnName
============================================
/abc/def/xyz
/abc/def/xyz
/abc/def/xyz
/abc/def/xyz
/abc/xyz

Я хочу вывод, подобный этому

Column1     Column2         Column3
abc         def             xyz
abc         def             xyz
abc         def             xyz
abc         def             xyz
abc         xyz             NULL

Я пытался использовать функции SUBSTRING и REPLACE, но не могу пройти дальше второго "/"

Ответы [ 3 ]

0 голосов
/ 08 ноября 2018

Если формат данных остается тем же, то, вероятно, вы можете попробовать использовать следующий код, включая объединение instr и substr -

select columnname, 
       substr(columnname,2,(instr(columnname,'/',1,2)-1)) as col1,  
       substr(columnname,(instr(columnname,'/',1,2)+1),instr(columnname,'/',1,3)-instr(columnname,'/',1,2)-1) as col2,
       substr(columnname,(instr(columnname,'/',1,3)+1),length(columnname)-instr(columnname,'/',1,3)) as col3
  from <table>; 
0 голосов
/ 08 ноября 2018

Джейсон А. Длинный ответ верен, но он не может обработать, если есть только два '/'. Например: Если в одном столбце есть «/ abc / xyz». Запрос не вернет значение, которое хочет пользователь.

Следующий запрос обрабатывает динамическое количество разделителей:

SELECT ColName, 
       Len(ColName) - Len(Replace(ColName, '/', '')), 
       CASE 
         WHEN Len(ColName) - Len(Replace(ColName, '/', '')) = 3 THEN 
         Parsename(Replace(ColName, '/', '.'), 3) 
         ELSE Parsename(Replace(ColName, '/', '.'), 2) 
       END, 
       CASE 
         WHEN Len(ColName) - Len(Replace(ColName, '/', '')) = 3 THEN 
         Parsename(Replace(ColName, '/', '.'), 2) 
         ELSE Parsename(Replace(ColName, '/', '.'), 1) 
       END, 
       CASE 
         WHEN Len(ColName) - Len(Replace(ColName, '/', '')) = 3 THEN 
         Parsename(Replace(ColName, '/', '.'), 1) 
       END 
FROM   TableName
0 голосов
/ 08 ноября 2018

Если вам нужно только последнее значение, просто используйте функцию PARSENAME.

SELECT PARSENAME(REPLACE('/RockReports/Custom/getConcordManagement', '/', '.'), 1);
...