оракул выбрать если не существует вставить - PullRequest
0 голосов
/ 06 октября 2019

Предположим, у меня есть таблица A с двумя столбцами b и c. Я хочу получить определенное значение, и, если оно не существует, инициализировать его с нуля. что-то вроде:

if  exists (select c from A where b=1) 
{return  (select c from A where b=1)}
else
{ (insert into A values(1,0)) return 0}

возможно ли сделать все это одним оператором?

1 Ответ

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

Итак, вы хотите оператор (или фрагмент, который будет использоваться в большем операторе), который будет возвращать значение c, где b = 1, или возвращать 0, если нет строк с b = 1. Это так?

Что вы хотите вернуть, если есть несколько строк, где b = 1? Ваш вопрос не имеет большого смысла, если это возможно в ваших данных. Итак, для ответа ниже я предполагаю, что в столбце b не может быть дубликатов. (Или, если быть точным, необязательно, чтобы в столбце b не было дубликатов; но необходимо , чтобы значение 1 появлялось в этом столбце не более одного раза.)

select nvl( (select c from A where b = 1), 0 ) from dual;

вернет единственное значение: если в таблице A есть строка, где b = 1, она вернет соответствующий c. Если строк с b = 1 нет, «скалярный подзапрос» (внутренний SELECT) вернет NULL. NVL возвращает свой второй аргумент, если первый аргумент равен NULL (в противном случае он возвращает первый аргумент).

Теперь, строго говоря, это решение не на 100% правильно. Если в таблице A есть строка с b = 1 и c равно NULL, то, возможно, вы захотите вернуть NULL, а не 0. Вам нужно будет уточнить, может ли c быть NULL, и если это возможно, то как бы вы этого хотелиобрабатываются. (Если вы хотите вернуть 0 и в этом случае, ТОГДА решение, приведенное выше, является на 100% правильным.)

...