NULL в случае в предикатах - PullRequest
0 голосов
/ 04 февраля 2020

скажите, пожалуйста, это реально - используйте конструкцию CASE, где выражение с IS NULL / IS NOT NULL будет возвращено в TNEN? У меня есть процедура в пакете, которая получает входной параметр, и он передается селектору в курсоре, который я хочу установить один из предикатов:

  select t1...
         t2...
  from test t1,
       test t2
  where t1.flg = 'N'
  AND t2.field = 'supertest'
  AND CASE 
            WHEN input_parm = 'Y' THEN t1.id IS NOT NULL
            WHEN input_parm = 'N' THEN t1.id IS NULL
            WHEN input_parm IS NULL THEN
            ELSE t1.id = input_parm
            END

input_parm - это параметр, входящий в процедуру

  • если input_parm = Y, тогда поле t1.id не равно нулю
  • если input_parm = N, тогда поле t1.id равно нулю
  • , если input_parm равно null, тогда это условие не должно приниматься, эти селекторы должны быть как из IS NULL, так и из NOT NULL
  • , если input_parm IS NOT NULL и! = 'Y' и! = 'N' тогда t1. id = input_parm

В этом примере компилятор ругается на IS NULL после THEN. Можете ли вы помочь мне, плз?

Ответы [ 2 ]

4 голосов
/ 04 февраля 2020

Предикаты выражения CASE (т. Е. То, что следует за THEN и ELSE) должны быть литеральными значениями, а не логическими выражениями. Вы можете изменить свое выражение CASE как:

AND
    (input_parm = 'Y' AND t1.id IS NOT NULL) OR
    (input_parm = 'N' AND t1.id IS NULL) OR
    input_parm IS NULL OR
    t1.id = input_parm
2 голосов
/ 04 февраля 2020

Проще использовать AND/OR, но если вы действительно хотите использовать CASE..WHEN, вы можете использовать следующее:

    CASE
        WHEN INPUT_PARM = 'Y'
             AND T1.ID IS NOT NULL THEN 1
        WHEN INPUT_PARM = 'N'
             AND T1.ID IS NULL THEN 1
        WHEN INPUT_PARM IS NULL THEN 1
        WHEN T1.ID = INPUT_PARM THEN 1
    END = 1

Cheers !!

...