<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)可能很有用,以确保双方的类型都是标准的。 –
我正在做一个数据库调用 –