2016-04-14 5 views
0

У меня есть следующий код:Как использовать NVL в пункте, где

SELECT cr_ts, msg_id, info 
FROM messaging_log 
WHERE UPPER(INFO) LIKE '%' || TRIM(UPPER(P_INFO)) || '%' 
AND cr_ts >= NVL(P_DATE, SYSDATE-10) 
AND msg_id = NVL(P_ID, msg_id) 
ORDER BY cr_ts desc; 

где P_INFO, P_DATE и P_ID являются параметрами. В нормальном случае каждый параметр равен NULL. Но тогда предложение where AND msg_id = NVL(P_ID, msg_ID) не возвращает строки, в которых msg_id является NULL. Что я упустил?

Как вернуть все записи, когда P_ID и msg_id являются NULL?

+0

Возможно, у вас есть значения NULL в таблице? – Aleksej

ответ

0

Попробуйте это;)

SELECT 
    cr_ts, 
    msg_id, 
    info 
FROM messaging_log 
WHERE UPPER(INFO) LIKE '%' || TRIM(UPPER(P_INFO)) || '%' 
AND ((P_DATE IS NULL AND cr_ts >= (SYSDATE - 10)) OR cr_ts >= P_DATE) 
AND (P_ID IS NULL OR msg_id = P_ID) 
ORDER BY cr_ts DESC; 
+0

Отлично работает для меня и является моим предпочтительным решением – ZerOne

0
SELECT cr_ts, msg_id, info 
FROM messaging_log 
WHERE UPPER(INFO) LIKE '%' || TRIM(UPPER(P_INFO)) || '%' 
AND cr_ts >= NVL(P_DATE, SYSDATE-10) 
AND NVL(msg_id,'*') = NVL(P_ID, '*') 
ORDER BY cr_ts desc; 
+0

Thats not 100% right, потому что тогда строки с msg_id не будут отображаться. Но с небольшой настройкой он работает. Спасибо: 'AND NVL (msg_id, -999) = NVL (P_ID, NVL (msg_id, -999))' – ZerOne

0

Если MSG_ID является NULL, то вы не можете сравнить значение NULL, используя равенства (=) оператора.

Смежные вопросы