Пересмотренный ответ, чтобы показать, как это можно сделать в SQL Server.
Сначала мы создадим эту функцию, как показано здесь (благодарность Кейду Брайанту, автору этой статьи):
https://www.sqlservercentral.com/scripts/find-the-nth-occurrence-of-a-character-in-a-string
Затем мы применяем стратегию изменения строки и ее разбиения на три столбца. Обратите внимание, что для столбца 3 первый символ обращенной строки удаляется перед тем, как он не будет обращен. Это удаляет "." от "HRS". Если есть случаи, когда исходная строка не заканчивается на «.», То подход должен быть изменен.
SELECT REVERSE(
SUBSTRING(
REVERSE(column1),
dbo.CHARINDEX2(' ', REVERSE(column1), 2) + 2,
LEN(REVERSE(column1)) - dbo.CHARINDEX2(' ', REVERSE(column1), 2) + 1
)
) Column1,
REVERSE(
SUBSTRING(
REVERSE(column1),
dbo.CHARINDEX2(' ', REVERSE(column1), 1),
dbo.CHARINDEX2(' ', REVERSE(column1), 2) - dbo.CHARINDEX2(' ', REVERSE(column1), 1)
)
) Column2,
REVERSE(
SUBSTRING(REVERSE(column1), 2, dbo.CHARINDEX2(' ', REVERSE(column1), 1) - 2)
) Column3
FROM data
| Column1 | Column2 | Column3 |
|------------------------------------|---------|---------|
| BKT, CAB, TIRES | 250 | HRS |
| FRONT BKT, REAR BKT, CAB, TRACKS | 1,234 | HRS |
| FORKS, MAST, CAB, 20 HP ENG, TIRES | 25,102 | HRS |
REGEXP_REPLACE было бы здесь полезно, если бы SQL Server поддерживал его, как это делают MySQL 8.0 и современные версии Oracle. Синтаксис отличается в зависимости от платформы базы данных, но концепция та же самая. Ниже приведен пример из MySQL 8.0:
mysql> select * from data;
+-------------------------------------------------+
| column1 |
+-------------------------------------------------+
| BKT, CAB, TIRES, 250 HRS. |
| FRONT BKT, REAR BKT, CAB, TRACKS, 1,234 HRS. |
| FORKS, MAST, CAB, 20 HP ENG, TIRES, 25,102 HRS. |
+-------------------------------------------------+
mysql> SELECT REGEXP_REPLACE(column1, '(.*)(, )(.* )(.*)(\.$)','$1') column1,
-> REGEXP_REPLACE(column1, '(.*)(, )(.* )(.*)(\.$)','$3') column2,
-> REGEXP_REPLACE(column1, '(.*)(, )(.* )(.*)(\.$)','$4') column3
-> FROM data;
+------------------------------------+---------+---------+
| column1 | column2 | column3 |
+------------------------------------+---------+---------+
| BKT, CAB, TIRES | 250 | HRS |
| FRONT BKT, REAR BKT, CAB, TRACKS | 1,234 | HRS |
| FORKS, MAST, CAB, 20 HP ENG, TIRES | 25,102 | HRS |
+------------------------------------+---------+---------+