2011-03-08 64 views
3

這是一個簡單的問題,但我現在無法想到如何做到這一點。搜索查詢中的空日期

我在搜索查詢中有一個日期字段。該查詢不是動態的,或者這會更容易。我需要能夠返回匹配輸入日期的記錄,或者如果沒有輸入日期,那麼它應該全部返回。

這是我有,但它不工作。它不返回任何行,當有標準或沒有時。

AND ((table.dateField = p_dateField) 
    OR (table.dateField = table.dateField and table.dateField is null)) 

在此先感謝。

與它一起工作了一個小時後,我來到了這一點:

and ( 
     (p_dateField IS NOT NULL AND table.dateField = p_dateField) 
     OR (p_dateField IS NULL AND (table.dateField is null or (table.dateField is not null)) 
    ) 

它適用於爲數不多的測試中,我已經能夠對其運行。如果任何人都可以建議更好的方法,請做。

謝謝!

回答

3

你試過:

AND ((table.dateField = p_dateField AND NOT(p_dateField is NULL)) OR p_dateField is NULL)

我假設p_dateField是日期參數

+0

泗門您好,我試過了。它返回我正在查找的記錄,但它也給我記錄日期爲空的記錄。我希望它只返回匹配日期的行,或者如果p_dateField爲null,那麼我希望它返回所有內容。 – gswanson 2011-03-08 21:28:14

+0

好點:我認爲table.dateField不允許NULL。我在我的答案中更新了OR語句的左側,以消除這部分語句中的空匹配 – 2011-03-08 22:25:04

1

如何:

AND table.dateField = NVL(pdateField, table.dateField) 

假設table.dateField不包含空值。如果確實如此,則可能:

AND NVL(table.dateField, SYSDATE+10000) = 
     NVL(pdateField, NVL(table.dateField, SYSDATE+10000) 

假設SYSDATE + 10000是一個不在數據中的值。

0

我會嘗試在或部分使用NVL條款:

AND ((table.dateField = p_dateField) 
     OR (NVL(p_datefield, to_date('01/01/1901','MM/DD/YYYY')) = 
      to_date('01/01/1901,'MM/DD/YYYY'))) 
3

只寫你的WHERE條件是這樣的:

where previous_conditions 
    AND ((table.dateField = p_dateField) or (p_dateField is null)) 
    and other_conditions;