有不同种类的NULL吗?

时间:2016-06-12 21:08:42

标签: tsql coldfusion null

这来自

Expected: a collection containing <true>
     but: was <false>, was <false>

这两种不同的空值吗?有什么区别

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

1 个答案:

答案 0 :(得分:6)

是的,有区别 - 但不是你想的方式。

NULL本身不具有数据类型,在评估SQL时,其中一个关联(隐式或显式)。使用上面的SELECT语句,数据类型适用于列元数据。没有明确的CASTdata 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中的解释方式,甚至在修改查询对象本身时也是如此。例如,使用日期时间对象更新三列中的每一列:

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

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

结果将大不相同。插入&#34; DateTimeNull&#34;的值仍然是一个约会对象。但是,当插入&#34; VarcharNull&#34;时,相同的值将被转换为字符串。插入&#34; NonSpecifiedNull&#34;时的整数后两者几乎肯定您希望或希望如何处理日期对象。这就是为什么最好在原始SQL查询中包含适当的CAST

Dump of Query Data

授予ColdFusion非常宽容,相对无类型。因此,将日期对象存储为字符串或整数可能并不总是会导致硬错误。但是,它确实强制隐式转换,这最多是不必要的,最坏的情况是容易出错和/或可能产生错误的结果。例如,如果您将原始日期与&#34; NonSpecifiedNull&#34;列,您可能希望它们相等,但是......由于数据类型,它们不是:

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

再次,最好CAST预先确定正确的类型,以确保预期的结果。