2016-06-12 34 views
4

這從是否有不同種類的NULL?

<cfquery name="data"> 
    SELECT 
     NULL     AS plainNull, 
     CAST(NULL AS datetime) AS Due_Date 

</cfquery> 

來的,都是這兩種不同類型的空值?有什麼區別

注:改編自 How can I call a function in another CFC file from within a query of a function in one cfc file?

+1

你在cfquery dbtype =「query」或者你查詢數據庫嗎?當您在UNION中使用此語句時,CAST(NULL作爲datetime)可能很有用,以確保雙方的類型都是標準的。 –

+0

我正在做一個數據庫調用 –

回答

6

是的,是有區別的 - 而不是你可能會想。

這並不是說NULL具有數據類型本身,一將相關它(隱含地或明確)作爲評價SQL的一部分。使用上面的SELECT語句,數據類型適用於列元數據。沒有明確的CAST,data type defaults to INT。如果您檢查查詢的元數據

<cfquery name="qTest" datasource="#variables.sqlServerDSN#"> 
    SELECT NULL AS NonSpecifiedNull 
     , CAST(NULL AS datetime) AS DateTimeNull 
     , CAST(NULL AS varchar(25)) AS VarcharNull 
</cfquery> 

<cfdump var="#getMetaData(qTest)#" label="Query MetaData"> 

,查詢中包含有三個不同的數據類型的列:

拿這個查詢integerdatetimevarchar

Dump of Query Metadata

從一個ColdFusion從數據類型的角度來看,數據類型會影響列值如何在各種函數,比較,QoQ和甚至修改查詢對象itse時被解釋如果。例如,用日期時間對象更新三列中的每一列:

<cfset dateTimeNow = now()> 
<cfset qTest.NonSpecifiedNull[1] = dateTimeNow> 
<cfset qTest.DateTimeNull[1] = dateTimeNow> 
<cfset qTest.VarcharNull[1] = dateTimeNow> 

<cfdump var="#qTest#" label="Query Values"> 

結果會有很大的不同。插入到「DateTimeNull」中的值仍然是一個日期對象。但是,插入「VarcharNull」時將相同的值轉換爲字符串,並將其插入「NonSpecifiedNull」時將其轉換爲整數。後兩者幾乎肯定是而不是您如何期望或希望處理日期對象。這就是爲什麼最好在原始SQL查詢中包含適當的CAST

Dump of Query Data

授予的ColdFusion是非常寬容的,相對無類型。因此,將日期對象作爲字符串或整數存儲並不總是會導致嚴重錯誤。但是,它確實強制隱式轉換,這最多是不必要的,最糟糕的是容易出錯並且/或者可能產生錯誤的結果。例如,如果您比較原始日期爲「NonSpecifiedNull」一欄,你可能會想到他們是平等的,但..他們都沒有,由於數據類型:

dateCompare(dateTimeNow, qTest.NonSpecifiedNull[1]) eq 0 ? "EQUAL" : "DIFFERENT" 

如此反覆,最好CAST到正確的類型預先確保預期的結果。