2016-04-14 6 views
0

Ich habe den folgenden Code:Wie NVL zu verwenden, in denen Klausel

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; 

wo P_INFO, P_DATE und P_ID Parameter sind. Im Normalfall ist jeder Parameter NULL. Aber dann gibt die WHERE-Klausel AND msg_id = NVL(P_ID, msg_ID) die Zeilen nicht zurück, in denen msg_id selbst NULL ist. Was habe ich verpasst?

Wie alle Einträge zurückgegeben werden, wenn P_ID und msg_id NULL sind?

+0

Vielleicht haben Sie NULL-Werte in Ihrer Tabelle? – Aleksej

Antwort

0

Versuchen Sie dies;)

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

Funktioniert gut für mich und ist meine bevorzugte Lösung – 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

Das ist nicht 100% richtig, weil dann die Zeilen mit einer msg_id nicht angezeigt werden. Aber mit wenig Anpassung funktioniert es. Danke: 'UND NVL (msg_id, -999) = NVL (P_ID, NVL (msg_id, -999))' – ZerOne

0

Wenn msg_id NULL ist, dann kann man nicht einen NULL-Wert unter Verwendung eines gleichen Operator (=) vergleichen.

Verwandte Themen