2014-09-22 2 views
0

Так что я пытался работать с плохо оптимизированной/созданной базой данных. Я знаю, что вы можете использовать декодирование внутри предложения where, но мне было интересно, можно ли использовать значение в предложении where после декодирования в выборе. В принципе, у меня есть случай Сорта, как этотOracle: DECODE и WHERE Раздел

DECODE(theRow, 'P', 1,'D',2,'T',3, ... (goes on a bit)) AS theRowDecoded 

И я хочу, чтобы выбрать значения между тем, что можно было бы отправить в этой строке (так сказать, между 5 и 8). Не уверен, почему они не просто использовали номера для этого столбца в базе данных (это станет более понятным и понятным программным способом), но, должно быть, нужно работать с тем, что у меня есть.

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

ответ

3

Вы не можете использовать псевдоним в предложении where. Есть несколько альтернатив.

Subquery

Сделать запрос в подзапрос использовать псевдоним на более высоком уровне.

SELECT 
    theRowDecoded 
FROM 
    (SELECT 
    DECODE(theRow, .....) as theRowDecoded 
    FROM 
    theTable) 
WHERE 
    theRowDecoded BETWEEN 5 AND 8 

Используйте исходные значения

Возможно, лучше, потому что, используя исходные значения также позволит использовать индексы для ИНЕКЕ. Кроме того, он короче, не настолько вложен, и, следовательно, более читабельный.

SELECT 
    DECODE(theRow, .....) as theRowDecoded 
FROM 
    theTable 
WHERE 
    theRow in ('T', 'X', 'Y', 'Z') 

Виртуальная колонка

В конце концов, это может быть лучше, чтобы изменить таблицу чисел. Вы можете сделать число a function based virtual column. Таким образом, числовой столбец также существует в таблице и может использоваться как любой другой столбец с той разницей, что он автоматически обновляется, если вы обновляете theRow.

Я не использовал виртуальные столбцы сам, но он должен работать так:

alter table theTable 
    add theRowDecoded int as generated always (decode(theRow, .....)) virtual; 

Actual колонка

Вместо виртуальной колонки, вы можете также добавить дополнительную колонку и сохранить два синхронизируются с триггером. Или вы можете полностью удалить theRow. Поскольку это может быть не так просто, в зависимости от ваших способностей и прав и приложений (приложений), которые используют эту базу данных, вы можете рассмотреть возможность введения нового столбца и сделать старый столбец виртуальным столбцом, поэтому он по-прежнему будет доступен как постоянный столбец только для чтения в течение переходного периода, в котором программное обеспечение обновляется для использования вашего нового числового столбца.

+0

Спасибо :) очень информативный и работает для меня. Я настрою виртуальный столбец позже.Gotta настроить его в базе данных нашей группы (поскольку официальное средство по-прежнему использует 10g, но это нормально, потому что мы как бы берем то, что хотим, и реструктурируем его в нашей 12c-базе данных). –

0

Вы можете повторить одно и то же выражение в списке полей. Я не знаю, можете ли вы использовать его псевдоним в предложении where (вам придется попробовать).

то, что вы не можете сделать (afaik), дает псевдоним выражения в предложении where и использует его в другом месте.