3

我一直在网上寻找解决方案,但没有出现。我在冷融合查询中有一个列,“date_hired”。如果我对查询进行 cfdump,如果它是日期,它会显示为日期,如果不是,则显示为 [空字符串]。查询中有8条记录;有些有 date_hired 的日期,有些没有。如果我尝试在此结果集上执行 q 的 aq:

SELECT date_hired
    FROM myQuery
    WHERE date_hired = ''

我收到一条错误消息:执行 = 时出现比较异常。不支持的类型比较异常:= 运算符不支持以下类型之间的比较:左侧表达式类型 =“NULL”。右侧表达式类型 = "STRING"。

好的,所以我将查询更改为:

SELECT date_hired
    FROM myQuery
    WHERE date_hired IS NOT NULL

但它返回所有 8 行,即使是 cfdump 中 date_hired 为 [空字符串] 的行。同样,如果我将 where 子句更改为“where date_hired IS NULL”,我会返回 0 行,甚至没有 [empty string] 行。

我不知所措。ISNULL() 和 LEN() 不能用于 q 的 aq。幸运的是,如果我对查询进行 cfloop 并输出 isDate(date_hired),它会在应该返回的地方返回 true,在应该返回的地方返回 false。所以我可以对查询进行 cfloop 并即时构建另一个,但这似乎是一种迂回的方式来做一些不应该很难的事情。我可以在 where 子句中使用一些条件吗?谢谢 - 厘米

4

2 回答 2

4

感谢亚历克斯的回复——我终于明白了。在这种情况下,我的查询是通过 cfquery 提取的,然后我稍后使用 queryAddColumn() 添加一些列。其中一列是 date_hired。如果我尝试使用 cfloop 路线,无论我将该列的值设置为(日期还是字符串),CF 都会将其保持为 NULL 类型(并且不适用于 IS NULL/IS NOT NULL)。因此,经过进一步研究,我尝试在 where 子句中使用 Cast() 函数:

<cfquery name="numberHired" dbtype="query">
        select count(*)
        from myQuery
        where CAST(date_hired AS varchar) <> '' 
  </cfquery>

它就像一个魅力。

于 2016-02-11T02:01:25.367 回答
1

这是另一种可能运行得更快的方法。它利用了查询列可以被视为数组的事实。

<cfquery name="dbQuery" datasource="oracleDB">
select trunc(sysdate) theDate
from dual
union
select null theDate
from dual
union
select trunc(sysdate - 1) theDate
from dual
</cfquery>

请注意,有两个值不为空。这个:

<cfdump var="#Listlen(ArrayToList(dbQuery['theDate']))#">

返回 2,这是您寻找的数字。

这种方法可能比使用 Q of Q 更有效。但是,Q of Q 方法更具可读性,这也很重要。

于 2016-02-11T11:56:39.367 回答