Извлечение года из строки в столбце в Oracle SQL - PullRequest
0 голосов
/ 16 января 2020

У меня есть столбец под названием SALE_PERIOD, в котором хранится строка, касающаяся того, когда и где продается продукт. Столбец заполняется с использованием следующих условных обозначений:

  1. Две буквы, обозначающие месяц, когда была совершена продажа
  2. Год, когда была совершена продажа
  3. Количество магазин, в котором произошла продажа

Например, продукт, проданный в январе 2018 года в магазине № 5, будет храниться как «JA20185»

Мне нужен запрос, который будет извлекать год продажа была произведена из этого столбца, и я могу записать ее в новый столбец следующим образом:

SELECT SALE_PERIOD, (The code used to solve the problem) AS SALE_YEAR
FROM My_Table

Я знаю, что окончательный код может выглядеть немного иначе, и любые альтернативные решения также значительно оценили.

Ответы [ 2 ]

3 голосов
/ 16 января 2020

Используйте SUBSTR, чтобы получить 4-символьную подстроку года, начиная с 3-го символа, а затем преобразовать ее в число:

SELECT sale_period,
       TO_NUMBER( SUBSTR( sale_period, 3, 4 ) ) AS sale_year,
       -- and for the other components:
       SUBSTR( sale_period, 1, 2 ) AS sale_month,
       TO_NUMBER( SUBSTR( sale_period, 7 ) ) AS sale_store
FROM   my_table;

выводит:

SALE_PERIOD | SALE_YEAR | SALE_MONTH | SALE_STORE
:---------- | --------: | :--------- | ---------:
JA20185     |      2018 | JA         |          5
DE2019123   |      2019 | DE         |        123

Поскольку столбец SALE_PERIOD имеет четко определенный формат для подстрок, вы также можете добавить в таблицу виртуальные столбцы:

ALTER TABLE my_table ADD (
  sale_year  NUMBER(4,0) GENERATED ALWAYS AS ( TO_NUMBER( SUBSTR( sale_period, 3, 4 ) ) ) VIRTUAL,
  sale_month CHAR(2)     GENERATED ALWAYS AS ( CAST( SUBSTR( sale_period, 1, 2 ) AS CHAR(2) ) ) VIRTUAL,
  sale_store NUMBER(5,0) GENERATED ALWAYS AS ( TO_NUMBER( SUBSTR( sale_period, 7 ) ) ) VIRTUAL
)

, затем:

SELECT * FROM my_table;

дает те же выходные данные, что и выше, с этими дополнительными виртуальными столбцами.

db <> fiddle здесь

0 голосов
/ 16 января 2020

Вы можете разделить шаблон [^[:digit:]] posix с помощью комбинации функций regexp_substr() и regexp_replace():

with my_table( sale_period ) as
(
 select 'a product sold in JAN 2018 at store number 5' from dual
)
select substr(substr(trim(regexp_substr(sale_period,'[^[:digit:]]+')),-3),1,2) 
       ||regexp_replace(sale_period,'[^[:digit:]]') as sale_year
  from my_table

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...