#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, будет помещен HDGeneral: Entry (HD)
. Есть ли способ изменить последнюю подстроку на lastIndexOf»(«?2. Смотрите обновленный ответ. Насколько важно это «(HD)»? Я думаю, что эти запросы могут предоставить вам базовый подход к решению задачи.