【问题标题】:Query null values查询空值
【发布时间】:2019-08-01 14:59:02
【问题描述】:

我的实例表中有 deletedTime 列。 现在我想检查 ColdFusion 的值是否为空。 查询只打印一条记录。 IsNull(test) 正在返回正确的值, 但IsNull(searchForDeletedInstances.deletedTime) 返回false 但值在数据表中为空..

<cfquery datasource="hostmanager" name="searchForDeletedInstances">
SELECT deletedTime
FROM instances
WHERE instanceId = <cfqueryparam value="#instanceId#" 
cfsqltype="CF_SQL_NVARCHAR">
</cfquery>

<cfloop query="searchForDeletedInstances">
    <cfset test= #deletedTime#>
</cfloop>

<cfreturn IsNull(test)>
<cfreturn IsNull(searchForDeletedInstances.deletedTime)>

【问题讨论】:

  • 这可以在 cfquery 标记中使用专门查找“AND deletedTime IS NULL”的 WHERE 子句来处理。然后您可以使用 searchForDeletedInstances.recordCount 来确定是否存在 NULL 值。 CF 2018 之前的 CF 版本使用空字符串来表示 NULL 值。 CF 2018 可以引用 NULL 值,但必须为每个管理员或应用程序启用。
  • @ScottJibben 您的评论就是问题的答案。发布它。

标签: sql coldfusion null cfml cfquery


【解决方案1】:

我会在查询中进行测试。

<cfquery datasource="hostmanager" name="searchForDeletedInstances">
SELECT deletedTime
FROM instances
WHERE instanceId = <cfqueryparam value="#instanceId#" cfsqltype="CF_SQL_NVARCHAR">
AND deletedTime IS NULL
</cfquery>

<cfreturn BooleanFormat(searchForDeletedInstances.recordcount)>

【讨论】:

    【解决方案2】:

    ColdFusion 2018 允许使用 NULL 值,但必须将服务器/站点配置为使用它。这可能会破坏很多旧代码。 2018 年之前的 ColdFusion 将使用空字符串作为 NULL 值。

    我会将查询更改为仅查找 NULL deletedTime 记录。然后使用 searchForDeletedInstances.recordCount 值来确定是否找到了 NULL 记录。代码看起来像这样:

    <cfquery datasource="hostmanager" name="searchForDeletedInstances">
    SELECT deletedTime
    FROM instances
    WHERE instanceId = <cfqueryparam value="#instanceId#" cfsqltype="CF_SQL_NVARCHAR">
    AND deletedTime IS NULL
    </cfquery>
    
    <cfset nullRecord = searchForDeletedInstances.recordCount ? true : false>
    
    <cfreturn nullRecord>
    

    【讨论】:

    • 好东西。 FWIW,如果函数返回类型是布尔值,您也可以只返回将被隐式转换的recordCount。
    • @Ageax 不适用于所有版本的 CF。 returnType 仅用于验证,因此返回 1 将通过布尔验证,但该函数仍将返回 1。但是,您可以在此处返回 (searchForDeletedInstances.recordCount gt 0),因为那将是一个布尔表达式。不需要三元或booleanFormat()
    • @Ageax,是的,在我的 C/C++ 编码中,我会使用 recordCount。问题是一些遗留代码会专门寻找真/假。 CF 允许一些最奇怪的东西,例如 。我的 C/C++ 大脑说那是一个字符串。 CF,可以将其评估为布尔值。这就是为什么我通常使用三元表达式强制输入真/假值。
    • @dewey,很遗憾听到 null 支持对您不起作用。这听起来像是一个不错的新功能,但我有太多遗留代码,除非网站是新的,否则我不确定我是否能够使用它。
    • @ScottJibben - 是的(没有双关语;-) .. 我对 returnType 的看法实际上是错误的。我忘记了它只测试一个值是否可以转换为特定类型,如布尔值,但实际上并不进行转换。大多数情况下它没有区别,但即使使用非遗留代码,我也隐约记得有一个奇怪的情况,所以是的,使用三元表达式可能更好。
    【解决方案3】:

    来自查询的空值作为空字符串返回。改为测试 IsDate()。您始终可以使用 cfdump 显示查询的内容,以便查看返回的数据和数据类型。

    【讨论】:

    • 谢谢,IsDate 函数可以正常工作。但遗憾的是没有 IsNull..
    猜你喜欢
    • 2015-04-18
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-04
    • 2022-01-01
    • 1970-01-01
    • 2013-02-11
    相关资源
    最近更新 更多