<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?
<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?
是的,是有區別的 - 而不是你可能會想。
這並不是說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">
,查詢中包含有三個不同的數據類型的列:
拿這個查詢integer
,datetime
和varchar
:
從一個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
。
授予的ColdFusion是非常寬容的,相對無類型。因此,將日期對象作爲字符串或整數存儲並不總是會導致嚴重錯誤。但是,它確實強制隱式轉換,這最多是不必要的,最糟糕的是容易出錯並且/或者可能產生錯誤的結果。例如,如果您比較原始日期爲「NonSpecifiedNull」一欄,你可能會想到他們是平等的,但..他們都沒有,由於數據類型:
dateCompare(dateTimeNow, qTest.NonSpecifiedNull[1]) eq 0 ? "EQUAL" : "DIFFERENT"
如此反覆,最好CAST
到正確的類型預先確保預期的結果。
你在cfquery dbtype =「query」或者你查詢數據庫嗎?當您在UNION中使用此語句時,CAST(NULL作爲datetime)可能很有用,以確保雙方的類型都是標準的。 –
我正在做一個數據庫調用 –