gpt4 book ai didi

tsql - 是否有不同类型的 NULL?

转载 作者:行者123 更新时间:2023-12-05 00:18:26 25 4
gpt4 key购买 nike

这来自

<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 , datetimevarchar :

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">

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

Dump of Query Data

当然,ColdFusion 非常宽容,而且相对无类型。因此,将日期对象存储为字符串或整数可能并不总是会导致硬错误。但是,它确实强制隐式转换,这充其量是不必要的,最坏的情况是容易出错和/或可能产生错误的结果。例如,如果您将原始日期与“NonSpecifiedNull”列进行比较,您可能会期望它们相等,但……由于数据类型的原因,它们不是:
dateCompare(dateTimeNow, qTest.NonSpecifiedNull[1]) eq 0 ? "EQUAL" : "DIFFERENT"

所以再次,最好到 CAST预先输入正确的类型以确保预期的结果。

关于tsql - 是否有不同类型的 NULL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37779101/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com