2016-06-12 35 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到正确的类型预先确保预期的结果。