оракул если 0, как если ноль (нвл) - PullRequest
6 голосов
/ 01 июня 2011

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

nvl (instr (substr (ovrflo_adrs_info, instr (ovrflo_adrs_info, 'bldg') + 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))

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

Ответы [ 4 ]

13 голосов
/ 28 сентября 2015

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

5 голосов
/ 01 июня 2011

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

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))
)

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

4 голосов
/ 06 февраля 2014

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

Чтобы воспроизвести nvl (A, B), но для 0 вместо нуля, вы можете сделать:

WHEN A != 0 THEN
  A
ELSE
  B
END

или более компактный Крейг (но труднее для другихчитай):

NVL(NULLIF(A,0),B)

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

DECODE(A,0,B,A)
4 голосов
/ 01 июня 2011

Я думаю, вам нужно использовать CASE

, например

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...