Как фильтровать по коротким именам в предложении where - PullRequest
0 голосов
/ 04 июня 2018

У меня есть вопрос, как мы можем отфильтровать значение в предложении where в регистре оператора OTHER, а затем фактические значения, присутствующие в конце базы данных.

Например,

WHERE
'&mwb_header.transport_mode' --want to create a parameter
(CASE WHEN (mwb_header.transport_mode='O')   THEN 'OCEAN' 
       WHEN (mwb_header.transport_mode='A')     THEN 'AIR' 
    WHEN (mwb_header.transport_mode='R')     THEN 'RAIL' 
    WHEN (mwb_header.transport_mode='T')     THEN 'TRUCK' 
  ELSE 'OTHERS' END) ;

Фактические значениядля этих столбцов в конце базы данных присутствуют 'O', 'A', 'R', 'T' и 'OTH', но я просто хочу использовать любое значение для фильтров типа 'O' или 'OCEAN' для фильтрацииправильные результаты.

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Если вы можете изменить структуру таблицы, я бы предложил добавить в таблицу «виртуальный столбец» с более длинными именами (например, OCEAN).

Данные вычисляются (или генерируются) из реальныхстолбец transport_mode.Он выглядит как обычный столбец, но в базе данных ничего не сохраняется, но при необходимости вычисляется как.

Другими словами, мы перемещаем ваш код, который выполняет перевод из «O» в «OCEAN» изWHERE в определение таблицы, чтобы оно было доступно каждому.

ALTER TABLE mwb_header ADD (long_transport GENERATED ALWAYS AS (
  CASE transport_mode
       WHEN 'O' THEN 'OCEAN'
       WHEN 'A' THEN 'AIR'
       WHEN 'R' THEN 'RAIL'
       WHEN 'T' THEN 'TRUCK'
                ELSE 'OTHERS'
   END));

Теперь вы (и все остальные запросы) можете использовать длинные имена:

SELECT * from mwb_header WHERE long_transport='OCEAN';

точнокак короткие имена:

SELECT * from mwb_header WHERE transport_mode='O';

результаты будут точно такими же.

Еще лучше, если в таблице много строк, вы даже можете поместить индекс в вычисляемый столбец для ускорениявещи вверх:

CREATE INDEX mwb_short_transport_idx ON mwb_header(long_transport);
0 голосов
/ 04 июня 2018

Ваш код выглядит нормально и, кажется, работает:

CREATE TABLE mwb_header (i NUMBER, transport_mode VARCHAR2(3));
INSERT INTO mwb_header VALUES (1, 'O');
INSERT INTO mwb_header VALUES (2, 'A');
INSERT INTO mwb_header VALUES (3, 'R');
INSERT INTO mwb_header VALUES (4, 'T');
INSERT INTO mwb_header VALUES (5, 'OTH');

SELECT *
  FROM mwb_header
 WHERE 'OCEAN' = (CASE WHEN (mwb_header.transport_mode='O') THEN 'OCEAN' 
                       WHEN (mwb_header.transport_mode='A') THEN 'AIR' 
                       WHEN (mwb_header.transport_mode='R') THEN 'RAIL' 
                       WHEN (mwb_header.transport_mode='T') THEN 'TRUCK' 
                                                            ELSE 'OTHERS' 
                   END) ;

возвращает

id  transport_mode
1   O

Я лично предпочитаю более короткий синтаксис

SELECT *
  FROM mwb_header
 WHERE 'OCEAN' = (CASE mwb_header.transport_mode
                       WHEN 'O' THEN 'OCEAN'
                       WHEN 'A' THEN 'AIR'
                       WHEN 'R' THEN 'RAIL'
                       WHEN 'T' THEN 'TRUCK'
                                ELSE 'OTHERS'
                   END);
...