oracle, если 0, например, если null (nvl)

#oracle

#Oracle

Вопрос:

у oracle есть хорошая встроенная функция для выполнения if null, однако я хочу сделать if = 0; есть ли простой способ сделать это?

nvl(instr(substr(ovrflo_adrs_info,instr(ovrflo_adrs_info,’корп’) 5),’ ‘), длина(substr(ovrflo_adrs_info,instr(ovrflo_adrs_info,’bldg’) 5))))

Это передается в качестве параметра функции substr.

Если instr(substr(ovrflo_adrs_info,instr(ovrflo_adrs_info,'bldg') 5),' ') равно != 0 , то я хочу это значение, в противном случае я хочу значение length(substr(ovrflo_adrs_info,instr(ovrflo_adrs_info,'bldg') 5))

есть ли простой способ сделать это?

Ответ №1:

Вы можете использовать NVL(NULLIF(A,'0'), B)

Ответ №2:

Я обнаружил, что оба ответа трудно читать из-за дополнительной многословности из исходного сообщения. Обобщая ответы Конрада и Крейга:

Для репликации nvl(A, B), но для 0 вместо null, вы можете сделать:

 WHEN A != 0 THEN
  A
ELSE
  B
END
  

или Craig более компактен (но его сложнее прочитать другим):

 NVL(NULLIF(A,0),B)
  

Я думаю, что следующее также сработало бы:

 DECODE(A,0,B,A)
  

Ответ №3:

Я думаю, вам нужно будет использовать РЕГИСТР

например

 WHEN instr(substr(ovrflo_adrs_info,instr(ovrflo_adrs_info,'bldg') 5),' ') != 0 THEN
  length(substr(ovrflo_adrs_info,instr(ovrflo_adrs_info,'bldg') 5))
ELSE
   Some Default
END as foo
  

Комментарии:

1. внутри вызова substring?

2. case when instr(ovrflo_adrs_info,'bld') > 0 then substr(ovrflo_adrs_info,instr(ovrflo_adrs_info,'bld') 5, case when instr(substr(ovrflo_adrs_info,instr(ovrflo_adrs_info,'bld') 5),' ') != 0 instr(substr(ovrflo_adrs_info,instr(ovrflo_adrs_info,'bld') 5),' ') else length(substr(ovrflo_adrs_info,instr(ovrflo_adrs_info,'bld') 5)))) end) else null end as BLDG_NM,

Ответ №4:

Технически вы могли бы сделать это с меньшим количеством ввода, поскольку:

 nvl(
    nullif(instr(substr(ovrflo_adrs_info,instr(ovrflo_adrs_info,'bldg') 5),' '),0),
    length(substr(ovrflo_adrs_info,instr(ovrflo_adrs_info,'bldg') 5))
)
  

Тем не менее, я обычно встаю на сторону Conrad и советую вам использовать CASE, чтобы было легче определить, каково назначение кода для будущего обслуживания.

Комментарии:

1. Хотя мне нравится nullif функция. Я должен буду помнить об этом для будущего использования…