Как разобрать определенную часть строки в отдельных столбцах в SQL? - PullRequest
0 голосов
/ 19 июня 2019

Мне нужно взять часть поля в таблице и разобрать его на два поля в sql. В настоящее время я использую MS SSMS. На данный момент я хочу сделать это только с оператором select. Поля будут иметь различное количество текста.

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

Вот что я сейчас пытаюсь:

SELECT
replace(Column1, '(.*)(,\s)(.*)(\s)(HRS)(\.)','$1') Column1,
replace(Column1, '(.*)(,\s)(.*)(\s)(HRS)(\.)','$3') Column2,
replace(Column1, '(.*)(,\s)(.*)(\s)(HRS)(\.)','$5') Column3
FROM Table1
Where Column1 like '%HRS.%'

мой результат - просто столбец 1 дублируется в столбцы 2 и 3

Я хочу, чтобы мой результат выглядел так:

         Column1                               Column 2    Column 3
ROW 1    BKT, CAB, TIRES                       250         HRS
ROW 2    FRONT BKT, REAR BKT, CAB, TRACKS      1,234       HRS
ROW 3    FORKS, MAST, CAB, 20 HP ENG, TIRES    25,102      HRS

1 Ответ

0 голосов
/ 20 июня 2019

Пересмотренный ответ, чтобы показать, как это можно сделать в 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     |
+------------------------------------+---------+---------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...