Member 12189753 Ответов: 1

Увеличение индекса столбца на основе другого значения столбца


Допустим, у меня есть таблица с 2 столбцами: один имеет различные даты (дата), а другой-значения с плавающей запятой (цена), включая нули. Чего я хочу добиться, так это добавить новый столбец (NON_ZERO_ID), который по существу имеет значение и увеличивается только в том случае, если цена не равна нулю. Вот желаемый результат:
ДАТА / ЦЕНА | NON_ZERO_ID
1/2/16| 0.12| 1
1/3/16|45.00| 2
1/4/16|нуль| нуль
1/5/16|40.00|3...

Что я уже пробовал:

Я пробовал использовать синтаксис row_number() over (order by..) для нумерации строк, но во всех случаях NON_ZERO_ID автоматически увеличивается, даже если есть нулевое значение для PRICE. Есть предложения? По сути, я хочу иметь возможность сделать NON_ZERO_ID с заранее заданной строкой, то есть ID1, ID2 и так далее.

barneyman

вы могли бы сделать это с помощью триггера на вставке

Почему вы пытаетесь сделать это таким образом, кажется (на первый взгляд) немного запутанным - что произойдет, если цена будет добавлена или удалена позже?

Добавление строк в rowids тоже плохая идея ... это должно быть сделано на уровне презентации-IMHO

Member 12189753

спасибо за предложение. Цена может быть добавлена или удалена позже, но для текущих целей мне нужно использовать идентификатор для соединения с другой справочной таблицей, которая дает ориентиры на основе цен и независимо от того, являются ли даты буднями или нет. По сути, мне нужно будет расширить логику здесь, чтобы обновить индикатор в зависимости от того, является ли это будний день или нет. И я понимаю вашу точку зрения на добавление строк к rowid. Возможно ли достичь решения без использования триггеров или вставок?

1 Ответов

Рейтинг:
2

Wendelius

Во-первых, это звучит так, как будто вы пытаетесь создать последовательность ординалов для определенных строк без пробелов. Если это так, то следует отметить, что у вас будут пробелы, если строки будут удалены. Кроме того, что произойдет, если цена будет обновлена до нуля или наоборот?

Сказав это, вы можете сделать вставку с помощью оператора select. Что-то вроде

INSERT INTO TableName
(DATE, PRICE, NON_ZERO_ID)
SELECT :datevariable
       :pricevariable
       CASE 
          WHEN :pricevariable IS NULL THEN NULL
          ELSE (SELECT MAX(NON_ZERO_ID) + 1
                FROM   TableName)
       END
FROM dual;

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