Разделение строк SQL по разделителям

#sql

#sql

Вопрос:

У меня есть столбец в таблице SQL, который содержит строки в формате:

 Provider - Category: General: Entry (1)
  

Я хотел бы создать инструкцию SQL, которая разбивает ее на 4 столбца, давая результат, подобный этому:

 Column1  | Column2  | Column3        | Column4
----------------------------------------------
Provider | Category | General: Entry | 1
  

Его нужно было бы разделить на - , затем на первый : , и я думаю, затем на ( и, наконец, удалить )

Как создать что-то подобное?

Комментарии:

1. Какую СУБД вы используете?

2. Всегда ли данные одинаковы? Или они могут меняться? Может ли пунктуация измениться или нет.

3. используя SQL 2012, и я только что заметил, что иногда данные могут содержать другой набор круглых скобок в General: Entry (HD) (1)

Ответ №1:

Если данные имеют одинаковую структуру, этот запрос должен сработать:

 DECLARE @TEXT VARCHAR(255) = 'Provider - Category: General: Entry (1)';

SELECT SUBSTRING(@TEXT,1,CHARINDEX('-',@TEXT)-1) AS COL1
,SUBSTRING(@TEXT,CHARINDEX('-',@TEXT) 2,CHARINDEX(':',@text)- 2 - CHARINDEX('-',@text))  AS COL2
,SUBSTRING(@TEXT,CHARINDEX(':',@TEXT) 2,CHARINDEX('(',@TEXT)- 2 - CHARINDEX(':',@TEXT)) AS COL3
,SUBSTRING(@TEXT,CHARINDEX('(',@TEXT) 1,CHARINDEX(')',@TEXT)- 1 - CHARINDEX('(',@TEXT)) AS COL4
  

Вывод:

 Col1        Col2        Col3             Col4
Provider    Category    General: Entry      1
  

Редактировать на основе комментария:

 DECLARE @TEXT VARCHAR(255) = 'Provider - Category: General: Entry (HD) (1)';

SELECT SUBSTRING(@TEXT,1,CHARINDEX('-',@TEXT)-1) AS COL1
,SUBSTRING(@TEXT,CHARINDEX('-',@TEXT) 2,CHARINDEX(':',@text)- 2 - CHARINDEX('-',@text))  AS COL2
,SUBSTRING(@TEXT,CHARINDEX(':',@TEXT) 2,CHARINDEX('(',@TEXT)- 2 - CHARINDEX(':',@TEXT)) AS COL3
--,SUBSTRING(@TEXT,CHARINDEX('(',@TEXT) 1,CHARINDEX(')',@TEXT)- 1 - CHARINDEX('(',@TEXT)) AS COL4
,REVERSE(SUBSTRING(REVERSE(@TEXT),2,CHARINDEX('(',(REVERSE(@TEXT))) - CHARINDEX(')',REVERSE(@TEXT))-1)) as COL4
  

При этом не имеет значения, есть ли у вас 'Provider - Category: General: Entry (HD) (1)' ИЛИ 'Provider - Category: General: Entry (HD) (1)' , вывод в любом случае:

 Col1        Col2        Col3             Col4
Provider    Category    General: Entry      1
  

Единственное, что он не содержит (HD) . НО вы можете объединить оба решения с помощью @TEXT NOT LIKE '%HD%' и @TEXT LIKE '%HD%' , а затем использовать UNION ALL в качестве обходного пути.

Комментарии:

1. Выглядит хорошо, когда они совпадают, но для чего-то подобного, Provider - Category: General: Entry (HD) (1) что иногда случается, вместо 1 в последнем столбце, где должен быть Column3, будет помещен HD General: Entry (HD) . Есть ли способ изменить последнюю подстроку на lastIndexOf»(«?

2. Смотрите обновленный ответ. Насколько важно это «(HD)»? Я думаю, что эти запросы могут предоставить вам базовый подход к решению задачи.