Oracle SQL - множественный возврат из дела - PullRequest
0 голосов
/ 07 мая 2018

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

Требования:

Мой запрос объединяет 4-5 таблиц на основе нескольких полей.

У меня есть столбец с именем продукта id. В моей таблице 1,5 миллиона строк. Из этих только 10% строк есть идентификаторы товаров со следующим атрибутом

A300X-%
A500Y-%

300,500, 700 - действительные номера моделей. X и Y являются классификациями. Мой запрос выбирает все системы.

У меня есть чек следующим образом

CASE
WHEN PID LIKE 'A300X%'
THEN 'A300' 
...
END AS MODEL
*

Аналогично 1017 *

CASE
WHEN PID LIKE 'A300X%'
THEN 'X'
...
END AS GENRE

Я ищу лучший вариант из приведенных ниже

  1. Как мне объединить оба утверждения и добавить еще один [третий] случай, который будет иметь эти два случая. * т.е. 1023 *
CASE 
    WHEN desc in ('AAA')
         First Case
         Second Case
    ELSE
         don't do anything for other systems
    END
  1. Есть ли способ регулярного выражения сделать это? Перед первым - возьми струну. Ищите X, Y, а также 300 500 700.

  2. Есть ли другой способ сделать это? Или делать с помощью кода это лучший способ?

Есть предложения?

EDIT:

Пример описания:

AAA,
SoftwARE, 
sw-app

Мой запрос выбирает все деск. Но дело должно работать только для ААА.

И действительные модели

A300X-2x-P
A500Y-5x-p
A700X-2x-p
A50CE-2x-P

Я должен рассмотреть только 300 500 700. И вышеупомянутые два случая.

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

MODEL     GENRE
A300      X
A500      Y
A300      Y

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

В: Как мне объединить оба оператора CASE выражения

Каждое CASE выражение будет возвращать одно значение. Если требуется вернуть два отдельных столбца в наборе результатов, для этого потребуется два отдельных выражения в списке SELECT.

Например:

DESC  PID           model_number  genre
----  ----------    ------------  ------
AAA   A300X-2x-P    300           X 
AAA   A500Y-5x-p    500           Y
AAA   A700X-2x-p    700           X
AAA   A50CE-2x-P    (NULL)        (NULL)
FOO   A300X-2x-P    (NULL)        (NULL)

Должно быть выражение для возврата столбца model_number и отдельное выражение для возврата столбца genre.

Невозможно, чтобы одно выражение возвращало два отдельных столбца.


В: и добавьте еще один [третий] случай, который будет иметь эти два случая.

A CASE выражение возвращает значение; мы можем использовать выражение CASE почти в любом месте оператора SQL, где мы можем использовать значение, в том числе в другом выражении CASE.

Мы также можем объединить несколько условий в WHEN тесте с AND и OR

В качестве примера объединения условий и вложений выражений CASE для выражений ...

 CASE 
 WHEN (    ( t.PID LIKE '_300%'  OR t.PID LIKE '_500%'  OR t.PID LIKE '_700%' )
       AND ( t.DESC = 'AAA' )
      )
 THEN CASE 
        WHEN ( t.PID LIKE '____X%' )
        THEN 'X'
        WHEN ( t.PID LIKE '____Y%' )
        THEN 'Y'
        ELSE NULL
      END
 ELSE NULL
 END AS `genre`

Есть другие выражения, которые будут возвращать эквивалентный результат; приведенный здесь пример не обязательно является лучшим выражением. Это просто демонстрация объединения условий и вложенных выражений CASE.

Обратите внимание, что для возврата другого столбца model нам необходимо включить другое выражение в список SELECT. Подобные условия необходимо будет повторить; невозможно сослаться на условия WHEN в другом выражении CASE.

0 голосов
/ 07 мая 2018

Исходя из ваших примеров данных, логика, подобная этой, будет работать:

(CASE WHEN REGEXP_LIKE(PID, '^A[0-9]{3}[A-Z]-')
      THEN SUBSTR(PID, 1, 4)
      ELSE PID
 END) AS MODEL

(CASE WHEN REGEXP_LIKE(PID, '^A[0-9]{3}[A-Z]-')
      THEN SUBSTR(PID, 5, 1)
      ELSE PID
 END) AS GENRE

Предполагается, что «номер модели» всегда начинается с «A» и сопровождается тремя цифрами (как в данных вашего примера). Если номер модели более сложный, вам может потребоваться regexp_substr(), чтобы извлечь нужные значения.

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