Динамически извлечь два или три текстовых пространства - PullRequest
0 голосов
/ 08 октября 2019

У меня есть таблица с некоторыми продуктами, которую я хочу разделить по содержанию первых двух или трех слов в зависимости от их содержания:

WITH 
test_data AS
(
SELECT 'GALLETAS SALADAS' AS product FROM dual UNION ALL
SELECT 'GALLETAS DE LECHE' AS product FROM dual UNION ALL
SELECT 'GALLETAS CRACKER CON SABOR A MANTEQUILLA' AS product FROM dual UNION ALL
SELECT 'GALLETAS INTEGRALES CON AVENA' AS product FROM dual UNION ALL
SELECT 'GALLETAS WAFER CON CREMA DE CHOCOLATE' AS product FROM dual UNION ALL
SELECT 'GALLETAS WAFER CON CREMA SABOR A VAINILLA' AS product FROM dual UNION ALL
SELECT 'GALLETAS DE MANTEQUILLA' AS product FROM dual UNION ALL
SELECT 'GALLETAS SALTIN' AS product FROM dual UNION ALL
SELECT 'GALLETAS DE CHOCOLATE CON CREMA SABOR A VAINILLA' AS product FROM dual UNION ALL
SELECT 'GALLETAS CON SABOR A VAINILLA' AS product FROM dual UNION ALL
SELECT 'GALLETAS CON CREMA SABOR A FRESA' AS product FROM dual UNION ALL
SELECT 'BARQUILLOS SABOR A CHOCOLATE CON CREMA SABOR A LECHE' AS product FROM dual UNION ALL
SELECT 'PASTEL CON CREMA SABOR A VAINILLA' AS product FROM dual UNION ALL
SELECT 'GALLETAS DE LECHE CON CREMA DE AVENA Y SABOR A LECHE' AS product FROM dual UNION ALL
SELECT 'GALLETAS CON CREMA SABOR A YOGURT FRESA' AS product FROM dual UNION ALL
SELECT 'GALLETAS CON AVENA Y CALCIO' AS product FROM dual UNION ALL
SELECT 'BARQUILLOS CON CREMA SABOR A FRESA' AS product FROM dual UNION ALL
SELECT 'BARQUILLOS RELLENOS CON CREMA DE CHOCOLATE Y AVELLANA' AS product FROM dual UNION ALL
SELECT 'GALLETAS MINI WAFER CUBIERTAS CON SABOR A CHOCOLATE' AS product FROM dual UNION ALL
SELECT 'GALLETAS WAFER CON CREMA SABOR A AREQUIPE (DULCE DE LECHE)' AS product FROM dual
)SELECT CASE 
        WHEN (INSTR(test_data.product,' ',1,2) = 0) THEN
             substr(test_data.product, 1, LENGTH(test_data.product))  
        WHEN (INSTR(test_data.product,' ',1, 3) = 0) THEN
             substr(test_data.product, 1, INSTR(test_data.product,' ',1, 2))
        ELSE substr(test_data.product, 1, INSTR(test_data.product,' ',1, 3))
       END
FROM   test_data;

ожидаемый результат:

GALLETAS SALADAS
GALLETAS DE LECHE
GALLETAS CRACKER
GALLETAS INTEGRALES
GALLETAS WAFER
GALLETAS WAFER
GALLETAS DE MANTEQUILLA
GALLETAS SALTIN
GALLETAS DE CHOCOLATE
GALLETAS CON SABOR
GALLETAS CON CREMA
BARQUILLOS SABOR
PASTEL CON CREMA
GALLETAS DE LECHE
GALLETAS CON CREMA
GALLETAS CON AVENA
BARQUILLOS CON CREMA
BARQUILLOS RELLENOS
GALLETAS MINI WAFER
GALLETAS WAFER

Я изменяю его, чтобы использовать ключевые слова в промежуточном слове DE или CON, также оценивая размер, но я не знаю, прежде чем усложнять себя и делать много строк, если есть какие-либоспособ упростить это.

дБ <> скрипка

1 Ответ

1 голос
/ 08 октября 2019

Вот решение, которое реализует логику, которую вы описали, используя функции Oracle regexp. Так как механизм регулярных выражений Oracle не поддерживает предпросмотры, я думаю, что необходимы два вызова функций:

REGEXP_REPLACE(
    REGEXP_SUBSTR(product, '^(\w+\s*\w*\s*\w*)'),
    '(\s+DE$)|(\s+CON$)',
    ''
)

Объяснение:

  • внутренний REGEXP_SUBSTR() возвращает первые три словапродукты (второе и третье слова являются необязательными)
  • внешний REGEXP_REPLACE() подавляет слова 'DE' или 'CON' в конце оставшейся строки, если они существуют

Демонстрация на DB Fiddle :

| SHORT_PRODUCT           |
| :---------------------- |
| GALLETAS SALADAS        |
| GALLETAS DE LECHE       |
| GALLETAS CRACKER        |
| GALLETAS INTEGRALES     |
| GALLETAS WAFER          |
| GALLETAS WAFER          |
| GALLETAS DE MANTEQUILLA |
| GALLETAS SALTIN         |
| GALLETAS DE CHOCOLATE   |
| GALLETAS CON SABOR      |
| GALLETAS CON CREMA      |
| BARQUILLOS SABOR A      |
| PASTEL CON CREMA        |
| GALLETAS DE LECHE       |
| GALLETAS CON CREMA      |
| GALLETAS CON AVENA      |
| BARQUILLOS CON CREMA    |
| BARQUILLOS RELLENOS     |
| GALLETAS MINI WAFER     |
| GALLETAS WAFER          |

Как уже отмечалось, кажется, что есть несколько расхождений, если ваш ожидаемый результат.

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