有不同种类的NULL吗?

Jam*_*ler 4 t-sql coldfusion null

这来自

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

</cfquery>
Run Code Online (Sandbox Code Playgroud)

这两种不同的零件是什么?有什么不同

注意:改编自 如何从一个cfc文件中的函数查询中调用另一个CFC文件中的函数?

Lei*_*igh 6

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

它本身并不NULL具有数据类型,作为评估SQL的一部分,它将与它(隐式或显式)相关联.使用上面的SELECT语句,数据类型适用于列元数据.如果没有显式CAST,则数据类型默认为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">
Run Code Online (Sandbox Code Playgroud)

如果检查元数据查询,查询包含了三个不同的数据类型的列:integer,datetimevarchar:

查询元数据转储

从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">
Run Code Online (Sandbox Code Playgroud)

结果将大不相同.插入"DateTimeNull"的值仍为日期对象.但是,插入"VarcharNull"时,相同的值将转换为字符串,插入"NonSpecifiedNull"时将转换为整数.后两者几乎肯定不是你期望或想要处理日期对象的方式.这就是为什么最好CAST在原始SQL查询中包含适当的.

查询数据转储

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

dateCompare(dateTimeNow, qTest.NonSpecifiedNull[1]) eq 0 ? "EQUAL" : "DIFFERENT"
Run Code Online (Sandbox Code Playgroud)

因此,最好先CAST预测正确的类型以确保预期的结果.