如何在Coldfusion查询查询中测试null /空字符串?

时间:2016-02-11 00:59:45

标签: sql coldfusion qoq

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

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行,甚至不返回[空字符串]。

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

2 个答案:

答案 0 :(得分:3)

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

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<a id="btn-submission" href="javascript:void(0)">Submission</a>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<div id="submission">
  <h2>Submission</h2>
  <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis quis lectus vitae enim tincidunt pellentesque. Fusce felis lorem, laoreet quis quam eget, sagittis ornare massa. Vivamus sit amet massa sit amet lacus efficitur feugiat elementum a massa. Nunc id fermentum turpis. Phasellus in molestie nulla. Pellentesque eget sem non velit tempus vestibulum in ac tortor. Aliquam ultricies diam ut dui ullamcorper, et scelerisque felis consectetur. In auctor massa ac turpis tristique lacinia. Maecenas quis suscipit neque.
</p></div>
<div id="others">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis quis lectus vitae enim tincidunt pellentesque. Fusce felis lorem, laoreet quis quam eget, sagittis ornare massa. Vivamus sit amet massa sit amet lacus efficitur feugiat elementum a massa. Nunc id fermentum turpis. Phasellus in molestie nulla. Pellentesque eget sem non velit tempus vestibulum in ac tortor. Aliquam ultricies diam ut dui ullamcorper, et scelerisque felis consectetur. In auctor massa ac turpis tristique lacinia. Maecenas quis suscipit neque.</div>

它就像一个魅力。

答案 1 :(得分: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>

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

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

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

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